当前位置 - 股票行情交易網 - 國際漫評 - SpringBoot自動裝配原理

SpringBoot自動裝配原理

初看@SpringBootApplication有很多的註解組成,其實歸納就是壹個"三體"結構,重要的只有三個Annotation:

(1)@Configuration註解

(2)@ComponentScan

(3)@EnableAutoConfiguration

從源碼中可以知道,最關鍵的要屬@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器。同時借助於Spring框架原有的壹個工具類:SpringFactoriesLoader,@EnableAutoConfiguration就可以實現智能的自動配置。

總結 :@EnableAutoConfiguration作用就是從classpath中搜尋所有的META-INF/spring.factories配置文件,並將其中org.springframework.boot.autoconfigure.EnableutoConfiguration對應的配置項通過反射(Java Refletion)實例化為對應的標註了@Configuration的JavaConfig形式的IoC容器配置類,然後匯總為壹個並加載到IoC容器。這些功能配置類要生效的話,會去classpath中找是否有該類的依賴類(也就是pom.xml必須有對應功能的jar包才行)並且配置類裏面註入了默認屬性值類,功能類可以引用並賦默認值。生成功能類的原則是自定義優先,沒有自定義時才會使用自動裝配類。

1、從spring-boot-autoconfigure.jar/META-INF/spring.factories中獲取redis的相關配置類全限定名(有120多個的配置類)RedisAutoConfiguration,壹般壹個功能配置類圍繞該功能,負責管理創建多個相關的功能類,比如RedisAutoConfiguration負責:JedisConnectionFactory、RedisTemplate、StringRedisTemplate這3個功能類的創建

2、RedisAutoConfiguration配置類生效的壹個條件是在classpath路徑下有RedisOperations類存在,因此springboot的自動裝配機制會會去classpath下去查找對應的class文件。

3.如果pom.xml有對應的jar包,就能匹配到對應依賴class,

4、匹配成功,這個功能配置類才會生效,同時會註入默認的屬性配置類@EnableConfigurationProperties(RedisProperties.class)

5.Redis功能配置裏面會根據條件生成最終的JedisConnectionFactory、RedisTemplate,並提供了默認的配置形式@ConditionalOnMissingBean(name = "redisTemplate")

6.最終創建好的默認裝配類,會通過功能配置類裏面的 @Bean註解,註入到IOC當中

7.用戶使用,當用戶在配置文件中自定義時候就會覆蓋默認的配置@ConditionalOnMissingBean(name = "redisTemplate")

1.通過各種註解實現了類與類之間的依賴關系,容器在啟動的時候Application.run,會調用EnableAutoConfigurationImportSelector.class的selectImports方法(其實是其父類的方法)-- 這裏需要註意,調用這個方法之前發生了什麽和是在哪裏調用這個方法需要進壹步的探討

2.selectImports方法最終會調用SpringFactoriesLoader.loadFactoryNames方法來獲取壹個全面的常用BeanConfiguration列表

3.loadFactoryNames方法會讀取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigure.jar 下面的spring.factories),獲取到所有的Spring相關的Bean的全限定名ClassName,大概120多個

4.selectImports方法繼續調用filter(configurations, autoConfigurationMetadata);這個時候會根據這些BeanConfiguration裏面的條件,來壹壹篩選,最關鍵的是

@ConditionalOnClass,這個條件註解會去classpath下查找,jar包裏面是否有這個條件依賴類,所以必須有了相應的jar包,才有這些依賴類,才會生成IOC環境需要的壹些默認配置Bean

5.最後把符合條件的BeanConfiguration註入默認的EnableConfigurationPropertie類裏面的屬性值,並且註入到IOC環境當中