1. 程式人生 > >SpringBoot2.0 自動配置的核心

SpringBoot2.0 自動配置的核心

1.新建專案

這個就由讀者自己去建(可以參考https://mp.csdn.net/postedit/83375675 idea快速配置)

2.檢視專案結構並解析

發現建好之後只有一個類可以使用,那為什麼Springboot可以自動配置這麼多東西列。我們從@SpringBootApplication這個註解上一探究竟吧。

當我們點進去之後發現如下:

發現裡面有一個註解@EnableAutoConfigure(啟用自動配置) 相信大家一看就知道了是什麼意思,我們在點進去看看

它匯入了AutoConfigurationImportSelector(自動配置輸入選擇器)

這個類,我們進去看看,就會看見selectImpors()這個方法。
通過debug發現,程式碼中有個集合包含了xxxAutoConfiguration,然後把這個集合變成string陣列返回。

既然上圖返回的集合是呼叫的getCandidateConfigurations(annotationMetadata,attributes),我們再跟蹤著看下

這個方法SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())傳了兩個引數第一個引數是:EnableAutoConfiguration.class,第二個是類載入器。我們在繼續跟蹤如下:

可以看到Springboot載入了類路徑下的META-INF/spring.factories,我們去找找可以看到如下:

可以看到上面全部是springboot自動載入的配置類。

我隨便找一個看看,我這裡看的是RedisAutoConfiguration,看看redis是如何配置的

上面的配置也很簡單

@Configuration :表示這個類是一個配置類,寫springboot專案肯定寫過這個註解

@ConditionalOnClass(RedisOperations.class) : 表示RedisOperations存在則啟用這個配置。@Conditional不熟悉的可以百度下。這裡就不細說了。
@EnableConfigurationProperties(RedisProperties.class) :RedisProperties這個類中初始化了redis的一些配置引數。springboot整合過redis的讀者,對下圖的配置應該就非常熟悉了,我們在yml或者properties中寫的配置就是這個類的熟悉。
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) :表示匯入redis連線的配置

springboot的自動配置原理就是根據AutoConfigurationImportSelector先載入spring-boot-autoconfigure.jar中類路徑下的spring.factories的xxxAutoConfiguration一些配置。也可以根據xxxProperties類中的屬性根據自己專案的需要改變值