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

【Spring Boot 源碼學(xué)習(xí)】深入 FilteringSpringBootCondition

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

Spring Boot 源碼學(xué)習(xí)系列

【Spring Boot 源碼學(xué)習(xí)】深入 FilteringSpringBootCondition,開發(fā)框架-Spring Boot,Spring Boot,源碼學(xué)習(xí),自動配置過濾匹配父類,ClassNameFilter

引言

前兩篇博文筆者帶大家從源碼深入了解了 Spring Boot 的自動裝配流程,其中自動配置過濾的實現(xiàn)由于篇幅限制,還未深入分析。

那么從本篇開始,Huazie 就帶大家走近 AutoConfigurationImportFilter,一起從源碼解析 FilteringSpringBootCondition、OnBeanCondition、OnClassConditionOnWebApplicationCondition 的實現(xiàn)。

往期內(nèi)容

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

Spring Boot 源碼學(xué)習(xí)
Spring Boot 項目介紹
Spring Boot 核心運行原理介紹
【Spring Boot 源碼學(xué)習(xí)】@EnableAutoConfiguration 注解
【Spring Boot 源碼學(xué)習(xí)】@SpringBootApplication 注解
【Spring Boot 源碼學(xué)習(xí)】走近 AutoConfigurationImportSelector
【Spring Boot 源碼學(xué)習(xí)】自動裝配流程源碼解析(上)
【Spring Boot 源碼學(xué)習(xí)】自動裝配流程源碼解析(下)

主要內(nèi)容

在開始本篇內(nèi)容之前,我們再次來回顧一下上篇博文介紹的 AutoConfigurationImportFilter 的源碼和相關(guān)的類圖:

@FunctionalInterface
public interface AutoConfigurationImportFilter {
	// 自動配置組件的過濾匹配
	boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata);
}

【Spring Boot 源碼學(xué)習(xí)】深入 FilteringSpringBootCondition,開發(fā)框架-Spring Boot,Spring Boot,源碼學(xué)習(xí),自動配置過濾匹配父類,ClassNameFilter

通過上面的關(guān)聯(lián)類圖,我們可以看到 AutoConfigurationImportFilter 接口實際上是由抽象類 FilteringSpringBootCondition 來實現(xiàn)的,另外翻看它的源碼,該抽象類還定義了一個抽象方法 getOutcomes ,然后 OnBeanConditionOnClassCondition、OnWebApplicationCondition 繼承該抽象類,實現(xiàn) getOutcomes 方法,完成實際的過濾匹配操作。

本篇,我們就從源碼入手重點介紹 FilteringSpringBootCondition

1. match 方法

上一篇博文我們已經(jīng)從 FilteringSpringBootCondition 的部分源碼進行了分析,它的 match 方法主要是調(diào)用 getOutcomes 方法,并將其返回的結(jié)果轉(zhuǎn)換成布爾數(shù)組。而這個 getOutcomes 方法是過濾匹配的核心功能,由抽象類 FilteringSpringBootCondition 的子類來實現(xiàn)它。

這里再簡單回顧一下 match 方法的處理邏輯:

@Override
public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
	ConditionEvaluationReport report = ConditionEvaluationReport.find(this.beanFactory);
	// 調(diào)用 由子類實現(xiàn)的 getOutcomes 方法,完成實際的過濾匹配操作
	ConditionOutcome[] outcomes = getOutcomes(autoConfigurationClasses, autoConfigurationMetadata);
	boolean[] match = new boolean[outcomes.length];
	// 將 getOutcomes 方法返回結(jié)果轉(zhuǎn)換成布爾數(shù)組
	for (int i = 0; i < outcomes.length; i++) {
		match[i] = (outcomes[i] == null || outcomes[i].isMatch());
		if (!match[i] && outcomes[i] != null) {
			logOutcome(autoConfigurationClasses[i], outcomes[i]);
			if (report != null) {
				report.recordConditionEvaluation(autoConfigurationClasses[i], this, outcomes[i]);
			}
		}
	}
	return match;
}

上述代碼中,我們可以看到,將 getOutcomes 方法返回結(jié)果轉(zhuǎn)換成布爾數(shù)組的循環(huán)邏輯中有一段代碼如下:

match[i] = (outcomes[i] == null || outcomes[i].isMatch());

這里是將返回結(jié)果轉(zhuǎn)換成布爾值,分別是:

  • 如果匹配結(jié)果為 null ,認為符合匹配要求, 設(shè)置 match[i] = true;
  • 如果匹配結(jié)果不為 null,并且 匹配對象的 isMatch == true,也認為符合匹配要求, 設(shè)置 match[i] = true

這個時候,我們就能理解 上篇博文講到的 不符合過濾匹配要求,則清空當前的自動配置組件 的邏輯:
【Spring Boot 源碼學(xué)習(xí)】深入 FilteringSpringBootCondition,開發(fā)框架-Spring Boot,Spring Boot,源碼學(xué)習(xí),自動配置過濾匹配父類,ClassNameFilter

當然 FilteringSpringBootCondition 內(nèi)還有其他的內(nèi)容,這些內(nèi)容在它的子類中也將使用到,我們先提前了解下,以便后續(xù)能更好地理解子類的功能實現(xiàn)。

2. ClassNameFilter 枚舉類

首先查看 ClassNameFilter 枚舉類的源碼【Spring Boot 2.7.9】:

protected enum ClassNameFilter {

	PRESENT {

		@Override
		public boolean matches(String className, ClassLoader classLoader) {
			return isPresent(className, classLoader);
		}

	},

	MISSING {

		@Override
		public boolean matches(String className, ClassLoader classLoader) {
			return !isPresent(className, classLoader);
		}

	};

	abstract boolean matches(String className, ClassLoader classLoader);

	// ....

}

ClassNameFilter 枚舉類包含兩個枚舉常量,分別是 PRESENTMISSING;這兩個枚舉常量都實現(xiàn)了 ClassNameFilter 枚舉類定義的 matches 的抽象方法,其中

  • PRESENT 中的 matches 返回 isPresent(className, classLoader);
  • MISSING 中的 matches 返回 !isPresent(className, classLoader);

我們繼續(xù)看 isPresent 方法,分析一下它的功能:

static boolean isPresent(String className, ClassLoader classLoader) {
	if (classLoader == null) {
		classLoader = ClassUtils.getDefaultClassLoader();
	}
	try {
		resolve(className, classLoader);
		return true;
	}
	catch (Throwable ex) {
		return false;
	}
}

protected static Class<?> resolve(String className, ClassLoader classLoader) throws ClassNotFoundException {
	if (classLoader != null) {
		return Class.forName(className, false, classLoader);
	}
	return Class.forName(className);
}

上述 isPresent 方法的邏輯其實也并不復(fù)雜,就是通過類加載器去加載指定的類【即 className 字符串對應(yīng)的類】:

  • 如果指定的類加載成功,則直接返回 true;
  • 如果指定的類加載失敗,則要拋出異常,捕獲異常后,返回 false。

那顯然 ClassNameFilter.PRESENT.matches(className, classLoader) 用于校驗指定的類是否加載成功

  • 如果指定的類加載成功,則返回 true
  • 如果指定的類加載失敗,則返回 false。

ClassNameFilter.MISSING.matches(className, classLoader) 用于校驗指定的類是否加載失敗

  • 如果指定的類加載失敗,則返回 true;
  • 如果指定的類加載成功,則返回 false

3. filter 方法

繼續(xù)翻看 FilteringSpringBootCondition 源碼,還有一個 filter 方法需要重點介紹下:

protected final List<String> filter(Collection<String> classNames, ClassNameFilter classNameFilter, ClassLoader classLoader) {
	if (CollectionUtils.isEmpty(classNames)) {
		return Collections.emptyList();
	}
	List<String> matches = new ArrayList<>(classNames.size());
	for (String candidate : classNames) {
		if (classNameFilter.matches(candidate, classLoader)) {
			matches.add(candidate);-
		}
	}
	return matches;
}

結(jié)合上面的 ClassNameFilter 枚舉類,我們可以很容易理解上面的代碼邏輯。

  • 如果 classNameFilterClassNameFilter.PRESENT,則 filter 方法獲取指定的類集合中加載成功的類集合【即匹配成功的類集合】;
  • 如果 classNameFilterClassNameFilter.MISSING,則 filter 方法獲取指定的類集合中加載失敗的類集合【即匹配失敗的類集合】。

總結(jié)

本篇 Huazie 帶大家介紹了自動配置過濾匹配的核心父類 FilteringSpringBootCondition,這對于筆者后續(xù)博文詳解它的三個子類【OnBeanConditionOnClassCondition、OnWebApplicationCondition】非常重要,敬請期待?。?!。文章來源地址http://www.zghlxwxcb.cn/news/detail-706983.html

到了這里,關(guān)于【Spring Boot 源碼學(xué)習(xí)】深入 FilteringSpringBootCondition的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Spring Boot 源碼學(xué)習(xí)】BootstrapRegistry 詳解

    【Spring Boot 源碼學(xué)習(xí)】BootstrapRegistry 詳解

    《Spring Boot 源碼學(xué)習(xí)系列》 前面的博文《BootstrapRegistryInitializer 詳解》,Huazie 帶大家一起詳細分析了 Spring Boot 啟動時加載并初始化 BootstrapRegistryInitializer 及其相關(guān)的類的邏輯。其中有個 BootstrapRegistry 接口只是簡單提及,本篇就詳細分析一下 BootstrapRegistry 接口,這對于我們后

    2024年02月20日
    瀏覽(17)
  • 【Spring Boot 源碼學(xué)習(xí)】初識 SpringApplication

    【Spring Boot 源碼學(xué)習(xí)】初識 SpringApplication

    《Spring Boot 源碼學(xué)習(xí)系列》 往期的博文, Huazie 圍繞 Spring Boot 的核心功能,帶大家從總整體上了解 Spring Boot 自動配置的原理以及自動配置核心組件的運作過程。這些內(nèi)容大家需要重點關(guān)注,只有了解這些基礎(chǔ)的組件和功能,我們在后續(xù)集成其他三方類庫的 Starters 時,才能夠

    2024年02月05日
    瀏覽(23)
  • 【Spring Boot 源碼學(xué)習(xí)】走近 AutoConfigurationImportSelector

    【Spring Boot 源碼學(xué)習(xí)】走近 AutoConfigurationImportSelector

    《Spring Boot 源碼學(xué)習(xí)系列》 上篇博文我們了解了 @EnableAutoConfiguration 注解,其中真正實現(xiàn)自動配置功能的核心實現(xiàn)者 AutoConfigurationImportSelector 還沒有詳細說明,本篇將從它的源碼入手來重點介紹。 在介紹 AutoConfigurationImportSelector 之前,有必要了解下它所實現(xiàn)的 ImportSelector 接

    2024年02月12日
    瀏覽(18)
  • 【Spring Boot 源碼學(xué)習(xí)】RedisAutoConfiguration 詳解

    【Spring Boot 源碼學(xué)習(xí)】RedisAutoConfiguration 詳解

    《Spring Boot 源碼學(xué)習(xí)系列》 上篇博文, Huazie 帶大家從源碼角度分析了 Spring Boot 內(nèi)置的 http 編碼功能,進一步熟悉了自動配置的裝配流程。本篇趁熱打鐵,繼續(xù)帶大家分析 Spring Boot 內(nèi)置的有關(guān) Redis 的自動配置類【 RedisAutoConfiguration 】。 在開始本篇的內(nèi)容介紹之前,我們先來

    2024年02月07日
    瀏覽(18)
  • 【Spring Boot 源碼學(xué)習(xí)】HttpEncodingAutoConfiguration 詳解

    【Spring Boot 源碼學(xué)習(xí)】HttpEncodingAutoConfiguration 詳解

    Spring Boot 源碼學(xué)習(xí)系列 前面的博文,我們從源碼角度介紹了自動裝配流程。雖然帶大家從整體上有了清晰的認識,但是我們還不能熟練地運用。本篇就以 Spring Boot 內(nèi)置的 http 編碼功能為例,來帶大家分析一下 HttpEncodingAutoConfiguration 的整個自動配置的過程。 在開始本篇的內(nèi)容

    2024年02月08日
    瀏覽(20)
  • 【Spring Boot 源碼學(xué)習(xí)】BootstrapRegistryInitializer 詳解

    【Spring Boot 源碼學(xué)習(xí)】BootstrapRegistryInitializer 詳解

    《Spring Boot 源碼學(xué)習(xí)系列》 書接前文《初識 SpringApplication》,我們從 Spring Boot 的啟動類 SpringApplication 上入手,了解了 SpringApplication 實例化過程。其中,有如下三塊內(nèi)容還未詳細分析: 本篇博文就主要圍繞 2.3 的內(nèi)容展開,詳細分析一下加載并初始化 BootstrapRegistryInitializer

    2024年02月04日
    瀏覽(18)
  • 【Spring Boot 源碼學(xué)習(xí)】OnWebApplicationCondition 詳解

    【Spring Boot 源碼學(xué)習(xí)】OnWebApplicationCondition 詳解

    《Spring Boot 源碼學(xué)習(xí)系列》 上篇博文帶大家從 Spring Boot 源碼深入詳解了 OnBeanCondition ,那本篇也同樣從源碼入手,帶大家深入了解 OnWebApplicationCondition 的過濾匹配實現(xiàn)。 在開始本篇的內(nèi)容介紹之前,我們先來看看往期的系列文章【有需要的朋友,歡迎關(guān)注系列專欄】: Spr

    2024年02月08日
    瀏覽(17)
  • 【Spring Boot 源碼學(xué)習(xí)】JedisConnectionConfiguration 詳解

    【Spring Boot 源碼學(xué)習(xí)】JedisConnectionConfiguration 詳解

    《Spring Boot 源碼學(xué)習(xí)系列》 上篇博文, Huazie 帶大家從源碼角度分析了 Spring Boot 內(nèi)置的有關(guān) Redis 的自動配置類【 RedisAutoConfiguration 】,其中有關(guān) LettuceConnectionConfiguration 和 JedisConnectionConfiguration 這兩個用于配置 Redis 連接的具體實現(xiàn)還未介紹。本篇就以我們常用的 Jedis 實現(xiàn)

    2024年02月05日
    瀏覽(19)
  • 【Spring Boot 源碼學(xué)習(xí)】@Conditional 條件注解

    【Spring Boot 源碼學(xué)習(xí)】@Conditional 條件注解

    《Spring Boot 源碼學(xué)習(xí)系列》 前面的博文,Huazie 帶大家從 Spring Boot 源碼深入了解了自動配置類的讀取和篩選的過程,然后又詳解了 OnClassCondition 、 OnBeanCondition 、 OnWebApplicationCondition 這三個自動配置過濾匹配子類實現(xiàn)。 在上述的博文中,我們其實已經(jīng)初步涉及到了像 @Conditi

    2024年02月07日
    瀏覽(18)
  • 【Spring Boot 源碼學(xué)習(xí)】BootstrapContext的實際使用場景

    【Spring Boot 源碼學(xué)習(xí)】BootstrapContext的實際使用場景

    《Spring Boot 源碼學(xué)習(xí)系列》 上一篇博文《BootstrapRegistry 初始化器實現(xiàn)》, Huazie 向大家介紹了如何自定義 BootstrapRegistryInitializer 接口實現(xiàn),并以此來執(zhí)行自定義的初始化操作【如注冊自定義的 Bean 、添加 BootstrapContext 關(guān)閉監(jiān)聽器】。其中涉及到了 BootstrapContext 的部分使用場景

    2024年03月11日
    瀏覽(33)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包