Spring Boot 自动装配(Auto Configuration)是 Spring Boot 最核心的功能之一,它能够根据你项目中引入的依赖和配置,自动创建和配置 Bean,让你不用写大量 XML 或 Java 配置。


一、先理解什么是自动装配

例如你只需要引入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

然后写:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

你并没有配置:

DispatcherServlet
Tomcat
Spring MVC
Jackson
CharacterEncodingFilter

但项目却能直接启动。

原因就是:

Spring Boot 根据依赖自动帮你创建了这些 Bean。


二、自动装配从哪里开始

启动类:

@SpringBootApplication
public class Application {
}

重点是:

@SpringBootApplication

它实际上是三个注解的组合:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

其中最关键的是:

@EnableAutoConfiguration

三、EnableAutoConfiguration 做了什么

源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

核心:

@Import(AutoConfigurationImportSelector.class)

Spring 启动时会加载:

AutoConfigurationImportSelector

这个类负责:

1. 找到所有自动配置类
2. 导入到Spring容器
3. 判断是否满足条件
4. 满足则创建Bean

四、自动配置类从哪里来的

Spring Boot 2.x:

META-INF/spring.factories

例如:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Spring Boot 3.x:

改成:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

例如:

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

启动时读取这个文件。


五、自动配置类如何生效

以数据源配置为例:

@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {
}

这里有个关键注解:

@ConditionalOnClass

意思:

如果类路径中存在 DataSource
则配置生效
否则跳过

例如:

项目引入:

mysql-connector-j

那么:

DataSource.class

存在。

自动配置生效:

@Bean
public DataSource dataSource() {
    ...
}

Spring容器自动拥有:

DataSource

六、各种 Conditional 条件注解

Spring Boot 自动装配大量依赖条件判断。

1. ConditionalOnClass

类存在才生效

@ConditionalOnClass(RedisTemplate.class)

2. ConditionalOnMissingBean

容器没有 Bean 才创建

@Bean
@ConditionalOnMissingBean
public RedisTemplate redisTemplate() {
}

意思:

如果你自己定义了RedisTemplate
自动配置就失效

这就是:

用户配置优先于自动配置


3. ConditionalOnBean

存在某个 Bean 才生效

@ConditionalOnBean(DataSource.class)

4. ConditionalOnProperty

配置文件满足条件

@ConditionalOnProperty(
    prefix="spring.redis",
    name="host"
)

只有:

spring:
  redis:
    host: localhost

配置后才生效。


七、配置文件是如何绑定的

例如:

server:
  port: 8081

对应:

@ConfigurationProperties(prefix="server")
public class ServerProperties {

    private Integer port;

}

Spring Boot 自动完成:

application.yml
      ↓
ServerProperties
      ↓
自动配置类
      ↓
Tomcat

这叫:

@ConfigurationProperties

属性绑定。


八、完整启动流程

@SpringBootApplication
          ↓
@EnableAutoConfiguration
          ↓
AutoConfigurationImportSelector
          ↓
读取 AutoConfiguration.imports
          ↓
加载所有自动配置类
          ↓
条件判断(Conditional)
          ↓
满足条件
          ↓
创建 Bean
          ↓
放入 IOC 容器

最终:

DispatcherServlet
Tomcat
DataSource
RedisTemplate
Jackson
MyBatis

全部自动注册。


九、面试回答(经典版)

如果面试官问:

Spring Boot 自动装配原理是什么?

可以回答:

Spring Boot 自动装配基于 @EnableAutoConfiguration 实现,该注解通过 @Import 导入 AutoConfigurationImportSelector。启动时会读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Boot 2.x 为 spring.factories)中的自动配置类,并加载到 Spring 容器。自动配置类通过 @ConditionalOnClass@ConditionalOnMissingBean@ConditionalOnProperty 等条件注解判断是否生效,满足条件后自动创建 Bean 并注册到 IOC 容器,从而实现“约定大于配置”的开发模式。

一句话总结:

自动装配 = 读取自动配置类 + 条件判断 + 自动注册 Bean 到 IOC 容器。

更多推荐