国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Spring Boot 源碼學習】自動裝配流程源碼解析(上)

這篇具有很好參考價值的文章主要介紹了【Spring Boot 源碼學習】自動裝配流程源碼解析(上)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

《Spring Boot 源碼學習系列》

【Spring Boot 源碼學習】自動裝配流程源碼解析(上),開發(fā)框架-Spring Boot,spring boot,自動裝配流程,加載自動裝配

引言

上篇博文,筆者帶大家從整體上了解了AutoConfigurationImportSelector 自動裝配邏輯的核心功能及流程,由于篇幅有限,更加細化的功能及流程詳解還沒有介紹。本篇開始將從其源碼入手,重點解析細化后的自動裝配流程源碼。

往期內容

在開始本篇的內容介紹之前,我們先來看看往期的系列文章【有需要的朋友,歡迎關注系列專欄】:

Spring Boot 源碼學習
Spring Boot 項目介紹
Spring Boot 核心運行原理介紹
【Spring Boot 源碼學習】@EnableAutoConfiguration 注解
【Spring Boot 源碼學習】@SpringBootApplication 注解
【Spring Boot 源碼學習】走近 AutoConfigurationImportSelector

主要內容

下面就讓我們從 AutoConfigurationImportSelectorselectImports 方法源碼入手,開始了解自動裝配流程。

下面來看一下 selectImports 的相關源碼【Spring Boot 2.7.9】:

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return NO_IMPORTS;
	}
	AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
	return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return EMPTY_ENTRY;
	}
	AnnotationAttributes attributes = getAttributes(annotationMetadata);
	List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
	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);
}

1. 自動配置開關

檢查自動配置是否開啟的邏輯位于 AutoConfigurationImportSelectorselectImports 方法中的第一段代碼。如果開啟自動配置,則繼續(xù)執(zhí)行后續(xù)操作;否則就返回空數組。

檢查自動配置是否開啟的源碼,如下所示:

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
      	return NO_IMPORTS;
   	}
	// ...省略
}

從上面的源碼可以看出,這里主要使用了 isEnabled 方法來判斷自動配置是否開啟;其中該方法返回 true,表示開啟自動配置,返回 false,表示關閉自動配置。

我們來看一下它的源碼,如下所示:

protected boolean isEnabled(AnnotationMetadata metadata) {
	if (getClass() == AutoConfigurationImportSelector.class) {
		return getEnvironment().getProperty(EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true);
	}
	return true;
}

通過閱讀上述 isEnabled 方法源碼,我們可以看出,如果當前類為 AutoConfigurationImportSelector,會從環(huán)境中獲取 keyEnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY 的配置屬性,而筆者前面的系列博文如果大家看過的話,介紹 EnableAutoConfiguration 注解時,就說了這個常量的值為 spring.boot.enableautoconfiguration 。

【Spring Boot 源碼學習】自動裝配流程源碼解析(上),開發(fā)框架-Spring Boot,spring boot,自動裝配流程,加載自動裝配

如果該屬性的配置獲取不到,則默認為 true,也就是默認會開啟自動配置。如果當前類為其他類,也則默認直接返回 true。

如果想覆蓋或重置該配置,我們可以在 application.propertiesapplication.yml 中針對 spring.boot.enableautoconfiguration 參數進行配置。

application.properties 配置關閉自動配置為例,如下所示 :

spring.boot.enableautoconfiguration=false

2. 加載自動配置組件

接下來,我們看到調用 getAutoConfigurationEntry 的代碼,它是用來封裝將被引入的自動配置信息:

AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);

然后我們進入 getAutoConfigurationEntry 方法,看到了獲取注解屬性的邏輯,如下所示:

AnnotationAttributes attributes = getAttributes(annotationMetadata);

// 從 AnnotationMetadata 返回適當的 AnnotationAttributes。默認情況下,此方法將返回 getAnnotationClass() 的屬性。
protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) {
	String name = getAnnotationClass().getName();
	AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));
	Assert.notNull(attributes, () -> "No auto-configuration attributes found. Is " + metadata.getClassName()
			+ " annotated with " + ClassUtils.getShortName(name) + "?");
	return attributes;
}

我們啟動先前建的 Spring Boot 項目的應用類,在 getAttributes 方法最后 return 處打個斷點,我們可以看到如下的邏輯:

【Spring Boot 源碼學習】自動裝配流程源碼解析(上),開發(fā)框架-Spring Boot,spring boot,自動裝配流程,加載自動裝配

了解到這,可以開始加載自動配置的組件了,也就是下面的代碼:

// 通過 SpringFactoriesLoader 類提供的方法加載類路徑中META-INF目錄下的
// spring.factories文件中針對 EnableAutoConfiguration 的注解配置類
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

我們進入 getCandidateConfigurations 方法中, 相關源碼如下所示:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
	List<String> configurations = new ArrayList<>(
			SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));
	ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);
	Assert.notEmpty(configurations,
			"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
					+ "are using a custom packaging, make sure that file is correct.");
	return configurations;
}

通過閱讀上述源碼,我們可以看出這里使用了 SpringFactoriesLoader 類提供的loadFactoryNames 方法來加載的。其中 loadFactoryNames 方法的第一個參數為 getSpringFactoriesLoaderFactoryClass 方法返回的 EnableAutoConfiguration.class。

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
	return EnableAutoConfiguration.class;
}

通過翻看 loadFactoryNames 方法對應的源碼,我們可以知道它是讀取的 META-INF/spring.factories 中的配置,并且只會讀取配置文件中針對自動配置的注冊類【即 EnableAutoConfiguration 相關的配置信息】。

SpringFactoriesLoader 類的 loadFactoryNames 方法相關源碼,由于篇幅有限,這里就不貼出來了,感興趣的朋友可以自行查閱,Spring Boot 中后續(xù)會有很多地方用到它,比如用于監(jiān)聽的 Listeners 和用于過濾的 Filters。

實際上 在 Spring Boot 2.7.9 版本中, 它自己內部的 META-INF/spring.factories 中有關自動配置的注冊類的配置信息已經被去除掉了,不過其他外圍的 jar 中可能有自己的 META-INF/spring.factories 文件,它里面也有關于自動配置注冊類的配置信息;

另外我們在 getCandidateConfigurations 方法中,也看到了另一行代碼獲取自動配置注冊類的信息,如下所示:

ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);

這里的代碼其實就是讀取的如下截圖的配置信息【同 META-INF/spring.factories 一樣,下面的配置也可能存在于不同的 jar 包中 】:

【Spring Boot 源碼學習】自動裝配流程源碼解析(上),開發(fā)框架-Spring Boot,spring boot,自動裝配流程,加載自動裝配

我們啟動先前建的 Spring Boot 項目的應用類,在 getCandidateConfigurations 方法 ImportCandidates 類調用處打個斷點,我們可以看到如下的截圖【這里 configurations 目前還是空數據,說明從 META-INF/spring.factories 沒有獲取到自動配置注冊類的相關信息,因為我們只引入了 Spring Boot 項目,并且它內部的 META-INF/spring.factories 中的確刪除了自動配置注冊類的相關信息】:

【Spring Boot 源碼學習】自動裝配流程源碼解析(上),開發(fā)框架-Spring Boot,spring boot,自動裝配流程,加載自動裝配

getCandidateConfigurations 方法 最后 return 處打個斷點,我們可以看到如下的截圖【這里 configurations 中加載的都是自動配置的注冊類,也就是 上述 ImportCandidates##load 加載的信息,這里讀取的是 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 中的配置信息】:

【Spring Boot 源碼學習】自動裝配流程源碼解析(上),開發(fā)框架-Spring Boot,spring boot,自動裝配流程,加載自動裝配

3. 自動配置組件去重

因為上述加載的自動配置注冊類,默認加載的是 ClassLoader 下面的所有 META-INF/spring.factoriesMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中的配置,所以就有可能出現在不同的jar包中有重復配置的情況。

Spring Boot 中則使用了 Java 中 Set 集合數據不可重復的特點,來實現去重處理,如下所示:

// 對獲得的注解配置類集合進行去重處理,防止多個項目引入同樣的配置類
configurations = removeDuplicates(configurations);

// 利用 Set 集合數據不可重復的特點,來實現去重處理
protected final <T> List<T> removeDuplicates(List<T> list) {
	return new ArrayList<>(new LinkedHashSet<>(list));
}	

總結

本篇 Huazie 帶大家通讀了 Spring Boot 自動裝配邏輯的部分源碼,詳細分析了加載自動裝配的流程,剩下排除和過濾自動配置的流程將在下一篇繼續(xù)講解。內容較多,能夠看到這的小伙伴,Huazie 在這感謝各位的支持。后續(xù)我將持續(xù)輸出有關 Spring Boot 源碼學習系列的博文,想要及時了解更新的朋友,訂閱這里即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-629958.html

到了這里,關于【Spring Boot 源碼學習】自動裝配流程源碼解析(上)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Spring Boot自動裝配

    Spring Boot自動裝配

    自動裝配是 Spring Boot 最核心的功能之一,第三方可以基于這個特性非常方便的和 Spring 做整合,實現自己的 Starter,做到開箱即用。 Java 早期并不支持注解,所以那會兒 Spring 只能通過 xml 的形式來配置。早期項目里要引入一個功能模塊,首先我們要引入 SDK,然后在 xml 里配置

    2024年01月23日
    瀏覽(36)
  • Spring Boot 自動裝配原理

    Java面試題目錄 Spring Boot自動裝配原理 ? Spring Boot啟動類上的 @SpringBootApplication 注解中包含 @EnableAutoConfiguration 注解,表示開啟自動裝配。在@EnableAutoConfiguration注解中使用@Import注解引入 AutoConfigurationImportSelector 組件,此類中通過 SpringFactoriesLoader.loadFactoryNames() 方法來掃描所有

    2024年01月25日
    瀏覽(30)
  • 深入了解Spring Boot自動裝配

    Spring Boot的自動裝配是一項強大的功能,能夠簡化應用程序的配置和開發(fā)過程。讓我們通過一系列詳細的例子來深入了解這一特性。 在Spring Boot中,自動裝配是指框架根據應用程序的依賴關系,自動配置和裝配相應的Bean,而無需手動設置。這使得開發(fā)者可以更專注于業(yè)務邏輯

    2024年01月23日
    瀏覽(30)
  • Spring Boot自動裝配原理(易懂)

    Spring Boot自動裝配原理(易懂)

    熟練使用Spring Boot那么自動裝配原理的掌握是必不可少的 Spring Boot的自動裝配實際上是從 META-INF/spring.factories 文件中獲取到對應的需要進行自動裝配的類,并生成相應的Bean對象,然后將它們交給Spring容器進行管理 啟動類的@SpringBootAppliation注解是一個組合注解,由以下3個注解組

    2024年02月16日
    瀏覽(22)
  • spring boot的自動裝配原理

    作者: 逍遙Sean 簡介:一個主修Java的Web網站游戲服務器后端開發(fā)者 主頁:https://blog.csdn.net/Ureliable 覺得博主文章不錯的話,可以三連支持一下~ 如有需要我的支持,請私信或評論留言! Spring Boot是一個開源的Java框架,可以幫助開發(fā)者快速構建基于Spring的應用程序。Spring Boo

    2024年02月10日
    瀏覽(29)
  • Spring Boot如何實現自動裝配

    Spring Boot的自動裝配是它的一大特點,可以大大提高開發(fā)效率,減少重復性代碼的編寫。本文將詳細講解Spring Boot如何實現自動裝配。 在傳統(tǒng)的Spring框架中,我們需要手動配置和管理Bean的依賴關系,但在Spring Boot中,大量的配置可以自動完成。這是因為Spring Boot中引入了自動裝

    2024年02月04日
    瀏覽(21)
  • Spring Boot中自動裝配機制的原理

    Spring Boot中自動裝配機制的原理

    1 .自動裝配,簡單來說就是自動把第三方組件的Bean裝載到Spring IOC容器里面 ,不需要開發(fā)人員再去寫B(tài)ean的裝配配置, 2.在Spring Boot應用里面,只需要在啟動類加上 @SpringBootApplication 注解就可以實現自動裝配。 3.@SpringBootApplication是一個復合注解, 真正實現自動裝配的注解是@

    2024年02月10日
    瀏覽(23)
  • redisson-spring-boot-starter 自動化配置源碼解析

    redisson-spring-boot-starter:3.25.2 此starter會自動注冊RedissonClient Bean 并可通過注冊RedissonAutoConfigurationCustomizer Bean實現配置自定義 spring-boot:2.7以上 org.redisson.spring.starter.RedissonAutoConfigurationV2 spring-boot:2.6以下 org.redisson.spring.starter.RedissonAutoConfiguration

    2024年01月17日
    瀏覽(25)
  • Spring retry(二)- 源碼解析-啟動裝配篇 @EnableRetry

    上一篇文章,我們快速介紹了下spring-retry的使用技巧,本篇我們將會剖析源碼去學習 英文翻譯我就不再解釋了,上面說的很清楚;這里重點提一下@Import(RetryConfiguration.class)這個注解,表明了@EnableRetry注解的啟動配置類是RetryConfiguration, 通過@Import注解來注入對應的配置類,這

    2024年02月10日
    瀏覽(22)
  • 深入解析 Spring 的 @Autowired:自動裝配的魔法與細節(jié)

    @Autowired 是 Spring 框架中的一個重要注解,用于自動裝配 bean 依賴。Spring 通過 @Autowired 可以自動將匹配的 bean 注入到需要的地方,如屬性、構造函數或 setter 方法等。 下面是 @Autowired 注解的詳細說明: 作用 自動裝配 : @Autowired 注解能夠自動裝配 Spring 容器中的 bean,使得開發(fā)

    2024年02月03日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包