SpringBoot 自動裝配原理
- 2022 年 11 月 6 日
- 筆記
早期的
Spring
項目需要添加需要配置繁瑣的xml
,比如MVC
、事務、資料庫連接等繁瑣的配置。Spring Boot
的出現就無需這些繁瑣的配置,因為Spring Boot
基於約定大於配置的理念,在項目啟動時候,將約定的配置類自動配置到IOC
容器里。這些都因為Spring Boot
有自動配置的特性。
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
容器中,無需開發人員手動添加配置,加快開發效率。
覺得文章不錯的話,點個贊吧!