微信公衆號:吉姆餐廳ak 學習更多源碼知識,歡迎關注。 java
SpringBoot2 | SpringBoot啓動流程源碼分析(一)web
SpringBoot2 | SpringBoot啓動流程源碼分析(二)spring
SpringBoot2 | @SpringBootApplication註解 自動化配置流程源碼分析(三)bash
SpringBoot2 | SpringBoot Environment源碼分析(四)微信
SpringBoot2 | SpringBoot自定義AutoConfiguration | SpringBoot自定義starter(五)模塊化
SpringBoot2 | SpringBoot監聽器源碼分析 | 自定義ApplicationListener(六)源碼分析
SpringBoot2 | 條件註解@ConditionalOnBean原理源碼深度解析(七)學習
SpringBoot2 | Spring AOP 原理源碼深度剖析(八)ui
SpringBoot2 | SpingBoot FilterRegistrationBean 註冊組件 | FilterChain 責任鏈源碼分析(九)spa
SpringBoot2 | BeanDefinition 註冊核心類 ImportBeanDefinitionRegistrar (十)
SpringBoot2 | Spring 核心擴展接口 | 核心擴展方法總結(十一)
springBoot爲咱們提供了自動化裝配的功能,簡單方便。能夠像使用插件同樣,對各個組件自由組合裝配。只需引入定義好的 starter 便可。有點相似於java的SPI機制,只不過SPI機制是爲了解決項目與項目之間的解耦,而starter方式實現了模塊化徹底解耦,實現熱插拔功能。
今天就來自定義一個自動化裝配的實現,自定義starter。
首先定義一個配置類模塊:
/**
* Created by zhangshukang on 2018/9/20.
*/
@Configuration
@ConditionalOnProperty(name = "enabled.autoConfituration", matchIfMissing = true)
public class MyAutoConfiguration {
static {
System.out.println("myAutoConfiguration init...");
}
@Bean
public SimpleBean simpleBean(){
return new SimpleBean();
}
}
複製代碼
而後定義一個starter模塊,裏面無需任何代碼,pom也無需任何依賴,只需在META-INF下面建一個 spring.factories
文件,添加以下配置:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
spring.study.startup.bean.MyAutoConfiguration
複製代碼
如圖所示:
最後只需在啓動類項目中引入咱們的 starter 模塊便可。在SpringBoot2 | @SpringBootApplication註解 自動化配置流程源碼分析(三)中,咱們提到了自動化配置的邏輯,入口爲spring 刷新容器的方法:
public void refresh() throws BeansException, IllegalStateException {
//...
invokeBeanFactoryPostProcessors(beanFactory);
//...
}
複製代碼
最終在AutoConfigurationImportSelector
解析spring.factories
文件:
spring.factories
默認的配置類。以下:
springBoot爲咱們提供的配置類有180多個,可是咱們不可能會所有引入。因此在自動裝配的時候,會去classPath下面尋找,是否有對應的配置類。若是有配置類,則按條件註解 @Conditional
或者@ConditionalOnProperty
等相關注解進行判斷,決定是否須要裝配。若是classPath
下面沒有對應的字節碼,則不進行任何處理。 咱們自定義的配置類也是以相同的邏輯進行裝配,咱們指定了如下註解:
@ConditionalOnProperty(name = "enabled.autoConfituration", matchIfMissing = true)
複製代碼
默認爲 true,因此自定義的starter成功執行。
springBoot
提供了一系列的條件註解:
@ConditionalOnBean(僅僅在當前上下文中存在某個對象時,纔會實例化一個Bean) @ConditionalOnClass(某個class位於類路徑上,纔會實例化一個Bean) @ConditionalOnExpression(當表達式爲true的時候,纔會實例化一個Bean) @ConditionalOnMissingBean(僅僅在當前上下文中不存在某個對象時,纔會實例化一個Bean) @ConditionalOnMissingClass(某個class類路徑上不存在的時候,纔會實例化一個Bean) @ConditionalOnNotWebApplication(不是web應用)
後面會進行條件註解源碼分析。
SpringBoot2 | SpringBoot啓動流程源碼分析(一)
SpringBoot2 | SpringBoot啓動流程源碼分析(二)
SpringBoot2 | @SpringBootApplication註解 自動化配置流程源碼分析(三)
SpringBoot2 | SpringBoot Environment源碼分析(四)
SpringBoot2 | SpringBoot自定義AutoConfiguration | SpringBoot自定義starter(五)