SpringBoot_自動配置
- 一、SpringBoot 的核心注解:
- @SpringBootApplication
- 使用main()方法啟動的類,隻有該注解。進入該注解如圖:
SpringBoot_自動配置 - @SpringBootConfiguration:底層是@Configuration;
- 使用main()方法啟動的類,隻有該注解。進入該注解如圖:
- 1、@Configuration
- 該注解用于JavaConfig中,被該注解标注的表示,該類是個配置類
- 2、@ComponentScan
- 自動掃描注解,掃描路徑下的元件或者Bean;@Controller/@Service/@Component/@Repository
- 3、@EnableAutoConfiguration
SpringBoot_自動配置 - 複合注解:自動載入應用程式所需要的所有預設配置。
- 最關鍵的注解@Import({EnableAUtoConfigurationImportSelector.class}), 該注解的作用是幫助SpringBoot 應用将所有符合條件的@Configuration 配置都加載到目前SpringBoot 應用中
SpringBoot_自動配置 SpringBoot_自動配置 SpringBoot_自動配置 SpringBoot_自動配置 - 實際上是掃描所有jar路徑下的META-INF/spring.factories,将其檔案包裝成Properties對象,擷取key值為EnableAutoConfiguration的資料,然後添加到容器裡。
- @AutoConfigurationPackage,詳情如圖
SpringBoot_自動配置 - Registrar 是 AutoConfigurationPackages 的内部類,方法 registerBeanDefinitions(),在預設的情況下就是将:主配置類(@SpringBootApplication)的所在包及其子包裡邊的元件掃描到Spring容器中。比如: Lambda 表達式中的@Data注解,都是由@AutoConfigurationPackage 注解掃描加載。
SpringBoot_自動配置
- @SpringBootApplication
- 二、SpringBoot 自動配置的流程:
- 概括:
- 通過 @EnableAutoConfiguration注解,從classpath 下搜尋所有的META-INF/spring.factories 配置檔案,并将EnableAutoConfiguration 對應的配置項通過反射執行個體化為對應标注了@Configuration的Ioc容器配置類,然後彙總為一個并加載到Ioc容器中。
- 詳解:
- 以 @SpringBootApplication 注解為核心,進入後依賴 @EnableAutoConfiguration注解,進入後依賴@Import注解,根據引入的類EnableAutoConfigurationImportSelector的父類 AutoConfigurationImportSelector,引入SpringFactoriesLoader類,加載所有的META-INF/spring.factories 配置檔案。将EnableAutoConfiguration 對應的配置項通過反射執行個體化為對應标注了@Configuration的Ioc容器配置類,然後彙總為一個并加載到Ioc容器中。
- 概括:
- 三、從源碼分析SpringBoot 自動配置的過程:
- 1、建立SpringApplication 對象,如圖
SpringBoot_自動配置 - 2、進入SpringApplication 的帶參構造方法,如圖
SpringBoot_自動配置 - 3、初始化方法,initialize(),如圖
SpringBoot_自動配置 - 4、通過getSpringFactoriesInstances()方法,執行個體化ApplicationContextInitializer、ApplicationListener,方法内部,如圖
SpringBoot_自動配置 - 5、loadFactoryNames()方法,如圖
SpringBoot_自動配置 - 6、在Spring-boot 和Spring-boot-autoconfig 的META-INF/spring.factories ,如圖
SpringBoot_自動配置 SpringBoot_自動配置
- 1、建立SpringApplication 對象,如圖
- 四、執行個體
- 比如Redis 的自動配置,使用如下:
- 1、在pom檔案中引入依賴;
- 2、在application.yml 或者 application.properties 引入如下配置:
SpringBoot_自動配置 - 3、 如此即可在項目中使用redis,內建非常簡單。
- 原理:
- 自動配置掃描了spring.factories ,找到如下所示:
SpringBoot_自動配置 SpringBoot_自動配置 - @ConditionalOnClass注解: 如果classpath,依賴中含有JedisConnection, RedisOperations,Jedis 這三個類,則添加redis的自動配置。
- 自動配置掃描了spring.factories ,找到如下所示:
- 總結:
- 根據jar包依賴,添加自動配置。
- 比如Redis 的自動配置,使用如下: