springboot自動配置原理


一、@SpringBootApplication是一個復合注解或派生注解,在@SpringBootApplication中有一個注解@EnableAutoConfiguration,該注解開啟自動配置。

1、@SpringBootApplication組合注解

 

二、@EnableAutoConfiguration注解也是一個派生注解,其中的關鍵功能由@Import提供,其導入的AutoConfigurationImportSelector的selectImports()方法通過SpringFactoriesLoader.loadFactoryNames()掃描所有具有META-INF/spring.factories的jar包。
spring-boot-autoconfigure-x.x.x.x.jar里就有一個spring.factories文件。spring.factories文件由一組一組的key=value的形式,其中一個key是EnableAutoConfiguration類的全類名,而它的value是一個xxxxAutoConfiguration的類名的列表,
這些類名以逗號分隔。

1、spring-boot-autoconfigure-x.x.x.x.jar -> META-INF/spring.factories -> org.springframework.boot.autoconfigure.xxx.xxxAutoConfiguration 類列表將會被實例化到Spring容器。

 

三、springboot項目啟動時,@SpringBootApplication用在啟動類在SpringApplication.run(...)的內部就會執行selectImports()方法,找到所有JavaConfig自動配置類的全限定名對應的class,然后將所有自動配置類加載到Spring容器中。

 

四、以redis自動配置,解析spring自動配置原理

1、將redis starter依賴加入

<!--redis jar-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

 

2、org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration會被實例化到容器。該類為什么會被實例化? 因為它在META-INF/spring.factories的Auto Configure列表。

 

3、org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration被實例化,然而redis也會被實例化即創建RedisTemplate在Spring容器。

然而實例化redis對象是有條件的即@ConditionalOnClass({RedisOperations.class}),意思:當給定的類名在類路徑上存在,則實例化當前Bean。

也就是想Spring創建redis實例對象,必須需要將redis starter包:spring-boot-starter-data-redis依賴引入。有了redis starter依賴springboot自動配置就會檢測到classpath路徑下有相關的類,然后就可以實例化對應的類了,這就是自動配置的原理。

知識點:類上有該注解@Configuration,類被實例化 時@bean會自動執行,生成對應的bean實例,放入Spring容器。

 

4、org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration會導入JedisConnectionConfiguration.class

@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})

JedisConnectionConfiguration.class有注解:@ConditionalOnClass({GenericObjectPool.class, JedisConnection.class, Jedis.class}) 

 

5、spring是怎樣讀取redis配置參數?

a.關鍵是org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration的注解:@EnableConfigurationProperties({RedisProperties.class})

知識點:@EnableConfigurationProperties會將配置文件的key-value映射成Java對象。

b.redis配置類,如果沒redis配置,使用本地的redis這需要本地安裝redis服務,如果有redis配置就設置redis host、port等屬性

 c.appliccation.yml redis配置。必須以spring.redis開頭

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM