Springboot自动装配原理
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 容器。
更多推荐


所有评论(0)