官方解釋Springboot:我們對Spring平臺和第三方庫持固執(zhí)己見的觀點(diǎn)奠旺,因此您可以以最小的麻煩開始使用枫虏。大多數(shù)Spring Boot應(yīng)用程序需要最少的Spring配置晦嵌。
為何springboot可以如此便攜竖般,則來源于springboot的自動配置身诺,接下來講解原理。如集成redis來說聪全。
從啟動類@SpringBootApplication入手
而此注解下的@EnableAutoConfiguration注解則是自動配置注解。
通過注解再點(diǎn)擊
發(fā)現(xiàn)有一個select選擇器
而此選擇器最終會有一個configuration數(shù)組被返回田藐。
而這個數(shù)組則是通過掃描一個spring.factory來獲取的
通過下面代碼發(fā)現(xiàn):
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
//最后追溯到這里
結(jié)論:springboot自動配置是尋找項(xiàng)目下的spring.factories的文件來實(shí)現(xiàn)自動配置
現(xiàn)在荔烧,我們找一個redis的factories來看看。
點(diǎn)進(jìn)此類查看
@Configuration( //申明配置類
proxyBeanMethods = false
)
//判斷有無RedisOperations這個類
@ConditionalOnClass({RedisOperations.class})
//配置這個類的參數(shù)在RedisProperties.class查找
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public RedisAutoConfiguration() {
通過作者代碼注釋汽久,我們可以總結(jié):
此類的注解:
1: 申明是一個配置類
2:判斷是否存在RedisOperations 鹤竭,存在則開始自動注入
3: 自動配置的參數(shù)在RedisProperties.class中查找
點(diǎn)擊 RedisProperties進(jìn)入
@ConfigurationProperties判斷配置文件有無spring.redis這個前綴。有的話則繼續(xù)查找參數(shù)注入景醇。如:spring.redis.port
所以:當(dāng)我們在集成redis的時候臀稚,只需要導(dǎo)入redis的jar包,并在application.yml下配置了spring.redis.下的參數(shù)(如:spring.redis.port 指定端口)三痰。
1:那么springboot會掃描項(xiàng)目是否導(dǎo)入了redis的jar包吧寺,則就是剛才的(判斷有無RedisOperations這個類)
2:springboot則會去application.yml查找是否添加了spring.redis開頭的配置。有則在初始化redis的時候?qū)⑴渲眉虞d進(jìn)去散劫。