Sping Boot 如何實現(xiàn)自動配置
Spring Boot
都需要創(chuàng)建一個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
對應(yīng)類:
自動配置主要由
@EnableAutoConfiguration
實現(xiàn),添加了@EnableAutoConfiguration
注解扔嵌,會導入AutoConfigurationImportSelector
類限府,里面的selectImports
方法通過SpringFactoriesLoader.loadFactoryNames()
掃描所有含有META-INF/spring.factories
的jar
包,將對應(yīng)key
為@EnableAutoConfiguration
注解全名對應(yīng)的value
類全部裝配到IOC
容器中。
Debug 驗證
打開Debug
調(diào)式模式痢缎,在getCandidateConfigurations
方法里面的SpringFactoriesLoader.loadFactoryNames()
處設(shè)置斷點胁勺,查看返回的configurations
集合:
第一個元素是tk.mybatis.mapper.autoconfigure.MapperAutoConfiguration
是因為引入了通用mapper
的依賴:
自動配置原理
原理流程匯總
從上面查看的源碼,可以知道Spring Boot
自動配置主要是@EnableAutoConfiguration
實現(xiàn)的独旷,@EnableAutoConfiguration
注解導入AutoConfigurationImportSelector
類,通過selectImports
方法調(diào)用SpringFactoriesLoader.loadFactoryNames()
掃描所有含有META-INF/spring.factories
文件的jar
包署穗,將spring.factories
文件中@EnableAutoConfiguration
對應(yīng)的類注入到IOC
容器中。
這些屬性自動配置到IOC
之后就無需自己手動配置bean
了嵌洼,Spring Boot
中的約定大于配置
理念案疲,約定是將需要的配置以約定的方式添加到IOC
容器中。
自動配置生效條件
那是不是spring.factories
文件對應(yīng)的配置都會加載到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
表示在類路徑中存在類才會配置該配置類褐啡。只有引入相關(guān)依賴才會自動配置該配置類。 -
@ConditionalOnMissingBean
表示只有不存在對應(yīng)的類的bean
才會自動配置該類鳖昌。
所以spring.factories
里面并不是所有的bean
都會裝配到IOC
容器中备畦,只會按需配置對應(yīng)的bean
。
總結(jié)
-
Spring Boot
自動配置原理- 1许昨、
@EnableAutoConfiguration
注解導入AutoConfigurationImportSelector
類懂盐。 - 2、執(zhí)行
selectImports
方法調(diào)用SpringFactoriesLoader.loadFactoryNames()
掃描所有jar
下面的對應(yīng)的META-INF/spring.factories
文件. - 3车要、限定為
@EnableAutoConfiguration
對應(yīng)的value
允粤,將這些裝配條件的裝配到IOC
容器中。
- 1许昨、
- 自動裝配簡單來說就是自動將第三方的組件的
bean
裝載到IOC
容器內(nèi)翼岁,不需要再去寫bean
相關(guān)的配置,符合約定大于配置理念司光。 -
Spring Boot
基于約定大于配置的理念琅坡,配置如果沒有額外的配置的話,就給按照默認的配置使用約定的默認值残家,按照約定配置到IOC
容器中榆俺,無需開發(fā)人員手動添加配置,加快開發(fā)效率。