SpringBoot2 | SpringBoot自定義AutoConfiguration | SpringBoot自定義starter(五)

微信公衆號:吉姆餐廳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。


自定義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(五)

SpringBoot2 | SpringBoot監聽器源碼分析 | 自定義ApplicationListener(六)

SpringBoot2 | 條件註解@ConditionalOnBean原理源碼深度解析(七)

相關文章
相關標籤/搜索