最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot 自動裝配原理及 Starter 實現(xiàn)原理解析

 更新時間:2024年09月28日 09:36:12   作者:Jerry.ZZZ  
SpringBoot通過@SpringBootApplication注解簡化了依賴引入和配置,該注解包括@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三部分,感興趣的朋友跟隨小編一起看看吧

1、Situation

傳統(tǒng) Spring 引入依賴時需要用 XML 或 Java 顯式配置,非常繁瑣。

2、Target

方便快捷地引入依賴或者配置屬性。

3、Action

3.1 @SpringBootApplication源碼解析

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
	@AliasFor(annotation = EnableAutoConfiguration.class)
	Class<?>[] exclude() default {};
	@AliasFor(annotation = EnableAutoConfiguration.class)
	String[] excludeName() default {};
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
	String[] scanBasePackages() default {};
	@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
	Class<?>[] scanBasePackageClasses() default {};
	@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")
	Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
	@AliasFor(annotation = Configuration.class)
	boolean proxyBeanMethods() default true;
}
--------------------------------------------------------
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}
-------------------------------------------------------
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
	Class<?>[] exclude() default {};
	String[] excludeName() default {};
}

主要有SpringBootConfiguration、EnableAutoConfiguration、ComponentScan三個注解構(gòu)成。

  • ComponentScan 注解的作用是掃描啟動類所在的包以及子包所有Bean組件并注冊到 IOC 容器中,其中 excludeFilters 指定了一個過濾器列表,通過兩個過濾器排除某些類,比如我們可以繼承 TypeExcludeFilter 并重寫 match 方法來自定義給排除哪些類。
  • SpringConfiguration 注解的作用就是標記 SpringBoot 啟動類為一個配置類。
  • EnableAutoConfiguration 是實現(xiàn)自動裝配的核心注解,通過@Import 注解導入 AutoConfigurationImportSelector 類

3.2 AutoConfigurationImportSelector 源碼

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		//1.判斷自動裝配開關(guān)是否打開
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		//2.獲取所有需要裝配的bean
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}
	protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		//1.再次判斷自動裝配開關(guān)是否打開
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		//2.獲取EnableAutoConfiguration注解中的 exclude 和 excludeName
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//3.獲取需要自動裝配的所有配置類,讀取META-INF/spring.factories
		//(不止讀取當前項目中的META-INF文件,所有的依賴中的META-INF文件都會被讀取)
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		//4.刪除重復依賴、過濾 exclude 的依賴
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = getConfigurationClassFilter().filter(configurations);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}
	...
}
------------------------------------------------------
public interface DeferredImportSelector extends ImportSelector {
}
-------------------------------------------------------
public interface ImportSelector {
    String[] selectImports(AnnotationMetadata var1);
}

AutoConfigurationImportSelector 實現(xiàn)了 ImportSelector 的selectImports 方法,顧名思義就是篩選引入的依賴,那么就需要加載所有的依賴,以及條件,再根據(jù)條件對依賴進行篩選。

4、Result

通過 Spring Boot 啟動類上的 @SpringBootApplication 注解,Spring 就可以遍歷所有 META-INF 的 spring.factories 文件中的配置類,并根據(jù) @EnableAutoConfiguration 的條件選擇是否將其注冊為 bean。

5、面試回答

啟動類的@SpringBootApplication注解由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三個注解組成,三個注解共同完成自動裝配;

  • @SpringBootConfiguration 注解標記啟動類為配置類
  • @ComponentScan 注解實現(xiàn)啟動時掃描啟動類所在的包以及子包下所有標記為bean的類由IOC容器注冊為bean
  • @EnableAutoConfiguration 通過 @Import 注解導入
  • AutoConfigurationImportSelector類,然后通過AutoConfigurationImportSelector 類的 selectImports
  • 方法去讀取需要被自動裝配的組件依賴下的spring.factories文件配置的組件的類全名,并按照一定的規(guī)則過濾掉不符合要求的組件的類全名,將剩余讀取到的各個組件的類全名集合返回給IOC容器并將這些組件注冊為bean。

6、實現(xiàn) Starter 的步驟

創(chuàng)建 Spring Boot 工程,添加項目需要的依賴,Spring Configuration Processor 這個依賴可以幫助開發(fā)者自動生成配置的的代碼提示。

刪除 pom.xml 的 build 部分

創(chuàng)建 Config 文件

在 resources 文件夾下新建 META-INF 文件夾,然后新建 spring.factories 文件,編寫配置項為自動引入配置的類。

之后可以對這個項目打包,在其他的項目中通過pom.xml文件的坐標引入這個項目

在 AutoConfigurationImportSelector 中也可以發(fā)現(xiàn)com.example.demo.DemoConfiguration 類已經(jīng)被成功加載了。

到此這篇關(guān)于Spring Boot 自動裝配原理及 Starter 實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Boot 自動裝配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring實例化bean的四種方式詳解

    Spring實例化bean的四種方式詳解

    這篇文章主要給大家介紹了關(guān)于Spring中實例化bean的四種方式:構(gòu)造方法、靜態(tài)工廠、實例工廠和FactoryBean,感興趣的可以了解一下
    2022-06-06
  • Java與Unix時間戳的相互轉(zhuǎn)換詳解

    Java與Unix時間戳的相互轉(zhuǎn)換詳解

    這篇文章主要為大家詳細介紹了Java與Unix時間戳的相互轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中Velocity快速對變量中的引號特殊字符進行轉(zhuǎn)義

    Java中Velocity快速對變量中的引號特殊字符進行轉(zhuǎn)義

    Velocity是一個基于Java的模板引擎,與Freemarker類似,這篇文章主要介紹了Java中Velocity如何對變量中的引號特殊字符進行轉(zhuǎn)義,主要記錄一下在使用中碰到的要對引號特殊字符進行轉(zhuǎn)義的問題,需要的朋友可以參考下
    2023-07-07
  • Java 測試URL地址是否能正常連接的代碼

    Java 測試URL地址是否能正常連接的代碼

    本文給大家分享兩段代碼分別是java測試URL地址是否能正常連接和Java檢測URL是否可用或者可打開的代碼,代碼都很簡單,有需要的朋友可以參考下
    2016-08-08
  • spring中的懶加載詳細解讀

    spring中的懶加載詳細解讀

    這篇文章主要介紹了spring中的懶加載詳細解讀,如果某個Bean再程序運行周期中都可能不會被適用,那么可以設(shè)定該Bean為懶加載,優(yōu)勢是盡量節(jié)省了服務器的資源,缺點是可能會導致某個相應的時間增加,需要的朋友可以參考下
    2023-10-10
  • mybatis?plus樂觀鎖及實現(xiàn)詳解

    mybatis?plus樂觀鎖及實現(xiàn)詳解

    這篇文章主要為大家介紹了mybatis?plus樂觀鎖及實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Java包裝類的概述與應用

    Java包裝類的概述與應用

    包裝類使用起來非常方便,但是沒有對應的方法來操作這些基本數(shù)據(jù)類型,可以使用一個類,把基本類型的數(shù)據(jù)裝起來,在類中定義一些方法,我們可以使用類中的方法來操作這些基本類型的數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于Java包裝類的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • SpringCloud微服務基礎(chǔ)簡介

    SpringCloud微服務基礎(chǔ)簡介

    今天帶大家學習一下SpringCloud微服務的相關(guān)知識,文中有非常詳細的圖文示例及介紹,對正在學習SpringCloud微服務的小伙伴們很有幫助哦,需要的朋友可以參考下
    2021-05-05
  • SpringBoot 如何自定義項目啟動信息打印

    SpringBoot 如何自定義項目啟動信息打印

    這篇文章主要介紹了SpringBoot 如何自定義項目啟動信息打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java常用的加密解決方案分享

    java常用的加密解決方案分享

    這篇文章全面介紹了Java中加解密技術(shù)的應用,包括哈希函數(shù)、對稱加密、非對稱加密、消息認證碼和數(shù)字簽名等,它詳細解釋了每種技術(shù)的工作原理,并提供了相應的Java代碼示例,文章還強調(diào)了密鑰管理的重要性,并提出了在實際應用中遵循的最佳實踐
    2025-01-01

最新評論

霍山县| 孝义市| 柳河县| 长寿区| 伊春市| 鄂州市| 新田县| 六枝特区| 察雅县| 务川| 汽车| 平湖市| 清苑县| 文水县| 修文县| 泽州县| 七台河市| 宁陕县| 盖州市| 晋宁县| 河东区| 阿荣旗| 延庆县| 滦南县| 天气| 甘肃省| 永州市| 老河口市| 舟曲县| 锦州市| 榕江县| 宜川县| 柘荣县| 卢湾区| 独山县| 洪泽县| 平舆县| 黔江区| 京山县| 肥西县| 温泉县|