SpringBoot 自动装配原理
Sping Boot 如何实现自动配置
Spring Boot
都需要创建一个mian
启动类,而启动类都含有@SpringBootApplication
注解,从启动类,一步步探索源码。
@SpringBootApplication注解
Spring Boot
启动类上都有一个 @SpringBootApplication
注解:
@EnableAutoConfiguration注解
@SpringBootApplication
里面有 @EnableAutoConfiguration
的注解:
AutoConfigurationImportSelector类
@EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类:
selectImports()方法
AutoConfigurationImportSelector
类找到 selectImports
方法,里面有getAutoConfigurationEntry
方法:
SpringFactoriesLoader.loadFactoryNames() 方法
getAutoConfigurationEntry
方法通过SpringFactoriesLoader.loadFactoryNames()
扫描所有含有META-INF/spring.factories
的jar
包:
spring-boot-autoconfigure-xxx.jar
项目包含META-INF/spring.factories
文件,spring.factories
是一个键值对的形式,扫描该文件下@EnableAutoConfiguration
对应类:
自动配置主要由
@EnableAutoConfiguration
实现,添加了@EnableAutoConfiguration
注解,会导入AutoConfigurationImportSelector
类,里面的selectImports
方法通过SpringFactoriesLoader.loadFactoryNames()
扫描所有含有META-INF/spring.factories
的jar
包,将对应key
为@EnableAutoConfiguration
注解全名对应的value
类全部装配到IOC
容器中。
Debug 验证
打开Debug
调式模式,在getCandidateConfigurations
方法里面的SpringFactoriesLoader.loadFactoryNames()
处设置断点,查看返回的configurations
集合:
第一个元素是tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration
是因为引入了通用mapper
的依赖:
自动配置原理
原理流程汇总
从上面查看的源码,可以知道Spring Boot
自动配置主要是@EnableAutoConfiguration
实现的,@EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类,通过selectImports
方法调用SpringFactoriesLoader.loadFactoryNames()
扫描所有含有META-INF/spring.factories
文件的jar
包,将spring.factories
文件中@EnableAutoConfiguration
对应的类注入到IOC
容器中。
这些属性自动配置到IOC
之后就无需自己手动配置bean
了,Spring Boot
中的约定大于配置
理念,约定是将需要的配置以约定的方式添加到IOC
容器中。
自动配置生效条件
那是不是spring.factories
文件对应的配置都会加载到IOC
容器中?比如下面的Kafka
自动配置类:
@Configuration
@ConditionalOnClass(KafkaTemplate.class)
@EnableConfigurationProperties(KafkaProperties.class)
@Import({ KafkaAnnotationDrivenConfiguration.class, KafkaStreamsAnnotationDrivenConfiguration.class })
public class KafkaAutoConfiguration {
private final KafkaProperties properties;
private final RecordMessageConverter messageConverter;
public KafkaAutoConfiguration(KafkaProperties properties, ObjectProvider<RecordMessageConverter> messageConverter) {
this.properties = properties;
this.messageConverter = messageConverter.getIfUnique();
}
@Bean
@ConditionalOnMissingBean(KafkaTemplate.class)
public KafkaTemplate<?, ?> kafkaTemplate(ProducerFactory<Object, Object> kafkaProducerFactory,
ProducerListener<Object, Object> kafkaProducerListener) {
....
}
其中有几个注解:
@ConditionalOnClass
@ConditionalOnMissingBean
复制代码
-
@ConditionalOnClass
表示在类路径中存在类才会配置该配置类。只有引入相关依赖才会自动配置该配置类。 -
@ConditionalOnMissingBean
表示只有不存在对应的类的bean
才会自动配置该类。
所以spring.factories
里面并不是所有的bean
都会装配到IOC
容器中,只会按需配置对应的bean
。
总结
-
Spring Boot
自动配置原理- 1、
@EnableAutoConfiguration
注解导入AutoConfigurationImportSelector
类。 - 2、执行
selectImports
方法调用SpringFactoriesLoader.loadFactoryNames()
扫描所有jar
下面的对应的META-INF/spring.factories
文件. - 3、限定为
@EnableAutoConfiguration
对应的value
,将这些装配条件的装配到IOC
容器中。
- 1、
- 自动装配简单来说就是自动将第三方的组件的
bean
装载到IOC
容器内,不需要再去写bean
相关的配置,符合约定大于配置理念。 -
Spring Boot
基于约定大于配置的理念,配置如果没有额外的配置的话,就给按照默认的配置使用约定的默认值,按照约定配置到IOC
容器中,无需开发人员手动添加配置,加快开发效率。