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

Spring注解之@Conditional使用解析

 更新時間:2024年01月03日 10:13:49   作者:潛水路人甲  
這篇文章主要介紹了Spring注解之@Conditional使用解析,@Conditional注解可以說是SpringBoot的條件注解,表示組件只有在所有指定條件都匹配時才有資格注冊,條件是可以在 bean 定義注冊之前??以編程方式確定的任何狀態(tài),需要的朋友可以參考下

@Conditional

@Conditional注解可以說是SpringBoot的條件注解,表示組件只有在所有指定條件都匹配時才有資格注冊,條件是可以在 bean 定義注冊之前??以編程方式確定的任何狀態(tài)。

@Conditional注解可以通過以下任何方式使用:

  • 作為直接或間接使用@Component注解的任何類的類型級注釋,包括@Configuration類
  • 作為元注解,用于編寫自定義構造型注釋
  • 作為任何@Bean方法的方法級注解

如果@Configuration類被標記為@Conditional ,那么與該類關聯(lián)的所有@Bean方法、 @Import 注解和@ComponentScan注解都將受制于條件。

SpringBoot @ConditionalOn*

SpringBoot提供的@ConditionalOn*的注解都是基于@Conditional注解實現(xiàn)

@ConditionalOnBean

僅當滿足所有指定要求的 bean 已包含在BeanFactory中時才匹配的Conditional 。

必須滿足所有要求才能匹配條件,但不必由同一個 bean 滿足。

@ConditionalOnClass

僅當指定的類在類路徑上時才匹配的Conditional 。

可以在@Configuration類上安全地指定value() ,因為在加載類之前使用 ASM 解析注釋元數(shù)據(jù)。

放置在@Bean方法上時需要格外小心,考慮將條件隔離在單獨的Configuration類中,特別是如果方法的返回類型與value()中的值匹配。

@ConditionalOnCloudPlatform

當指定的云平臺處于活動狀態(tài)時匹配的Conditional。 

@ConditionalOnExpression

取決于 SpEL 表達式的值的條件元素的配置注解。

@ConditionalOnJava

根據(jù)運行應用程序的 JVM 版本匹配的Conditional。

@ConditionalOnJndi

基于 JNDI InitialContext的可用性和查找特定位置的能力匹配的Conditional。

@ConditionalOnMissingBean

僅當BeanFactory中已不包含滿足指定要求的 bean 時才匹配的Conditional 。 條件匹配不必滿足任何要求,并且同一bean不必滿足這些要求。

@ConditionalOnMissingClass

僅當指定的類不在類路徑上時才匹配的Conditional。

@ConditionalOnNotWebApplication

僅在應用程序上下文不是 Web 應用程序上下文時匹配的Conditional。

@ConditionalOnProperty

檢查指定屬性是否具有特定值的Conditional 。 默認情況下,屬性必須存在于Environment中并且不等于false 。 havingValue()和matchIfMissing()屬性允許進一步自定義。havingValue屬性可用于指定屬性應具有的值。如果該屬性根本不包含在Environment中,則matchIfMissing()屬性。 默認情況下,缺少的屬性不匹配。

@ConditionalOnResource

僅當指定資源在類路徑上時才匹配的Conditional 。

@ConditionalOnSingleCandidate

僅當指定類的 bean 已包含在BeanFactory中并且可以確定單個候選者時才匹配的Conditional 。 如果BeanFactory中已包含多個匹配的 bean 實例但已定義主要候選者,則條件也將匹配; 本質上,如果自動裝配具有定義類型的 bean,則條件匹配將成功。 該條件只能匹配到目前為止已由應用程序上下文處理的 bean 定義,因此,強烈建議僅在自動配置類上使用此條件。 如果候選 bean 可能由另一個自動配置創(chuàng)建,請確保使用此條件的 bean 在之后運行。

@ConditionalOnWebApplication

當應用程序是 Web 應用程序時匹配的Conditional 。 默認情況下,任何 Web 應用程序都會匹配,但可以使用type()屬性縮小范圍。

@ConditionalOn*實現(xiàn)原理

以@ConditionalOnBean為例

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)
public @interface ConditionalOnBean{
//...
}

@Conditional作為元注解,OnBeanCondition繼承SpringBootCondition,SpringBootCondition

實現(xiàn)自org.springframework.context.annotation.Condition。

public abstract class SpringBootCondition implements Condition {
	private final Log logger = LogFactory.getLog(getClass());
	@Override
	public final boolean matches(ConditionContext context,
			AnnotatedTypeMetadata metadata) {
		String classOrMethodName = getClassOrMethodName(metadata);
		try {
			ConditionOutcome outcome = getMatchOutcome(context, metadata);
			logOutcome(classOrMethodName, outcome);
			recordEvaluation(context, classOrMethodName, outcome);
			return outcome.isMatch();
		}
		catch (NoClassDefFoundError ex) {
		}
	}
}
//org.springframework.boot.autoconfigure.condition.OnBeanCondition
	@Override
	public ConditionOutcome getMatchOutcome(ConditionContext context,
			AnnotatedTypeMetadata metadata) {
		ConditionMessage matchMessage = ConditionMessage.empty();
		if (metadata.isAnnotated(ConditionalOnBean.class.getName())) {
			BeanSearchSpec spec = new BeanSearchSpec(context, metadata,
					ConditionalOnBean.class);
			MatchResult matchResult = getMatchingBeans(context, spec);
			if (!matchResult.isAllMatched()) {
				String reason = createOnBeanNoMatchReason(matchResult);
				return ConditionOutcome.noMatch(ConditionMessage
						.forCondition(ConditionalOnBean.class, spec).because(reason));
			}
			matchMessage = matchMessage.andCondition(ConditionalOnBean.class, spec)
					.found("bean", "beans")
					.items(Style.QUOTE, matchResult.getNamesOfAllMatches());
		}
        //...
		return ConditionOutcome.match(matchMessage);
	}

到此這篇關于Spring注解之@Conditional使用解析的文章就介紹到這了,更多相關@Conditional使用解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis中執(zhí)行相關SQL語句的方法

    MyBatis中執(zhí)行相關SQL語句的方法

    本文主要介紹了MyBatis中執(zhí)行相關SQL語句的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • SpringBoot啟動速度優(yōu)化的5個技巧分享

    SpringBoot啟動速度優(yōu)化的5個技巧分享

    作為一名后端開發(fā),日常工作中經常與 Spring Boot 框架打交道,而Spring Boot 啟動慢絕不是一個可以忽視的小問題,而是關系到開發(fā)效率、系統(tǒng)穩(wěn)定性和業(yè)務發(fā)展的關鍵痛點,本文小編就和大家分享5個SpringBoot啟動慢的優(yōu)化點吧
    2026-04-04
  • Seata?AT模式前后鏡像是如何生成詳解

    Seata?AT模式前后鏡像是如何生成詳解

    這篇文章主要為大家介紹了Seata?AT模式前后鏡像是如何生成的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Java中的Spring?如何處理循環(huán)依賴

    Java中的Spring?如何處理循環(huán)依賴

    這篇文章主要介紹了Java中的Spring?如何處理循環(huán)依賴,依賴指的是Bean與Bean之間的依賴關系,循環(huán)依賴指的是兩個或者多個Bean相互依賴,關于更多Spring?處理循環(huán)依賴的詳情,需要的朋友可以參考下面文章具體內容
    2022-05-05
  • Java實現(xiàn)微信掃碼授權登錄完整步驟

    Java實現(xiàn)微信掃碼授權登錄完整步驟

    微信掃碼登錄是目前非常流行的第三方登錄方式,這篇文章主要介紹了Java實現(xiàn)微信掃碼授權登錄的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • 將Java的List結構通過GSON庫轉換為JSON的方法示例

    將Java的List結構通過GSON庫轉換為JSON的方法示例

    GONS是Google在GitHub上開源的Java類庫,提供各種Java對象和JSON格式對象之間的轉換功能,將Java的List結構通過GSON庫轉換為JSON的方法示例
    2016-06-06
  • SpringBoot如何整合SpringDataJPA

    SpringBoot如何整合SpringDataJPA

    這篇文章主要介紹了SpringBoot整合SpringDataJPA代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java基于JNDI 實現(xiàn)讀寫分離的示例代碼

    Java基于JNDI 實現(xiàn)讀寫分離的示例代碼

    本文主要介紹了Java基于JNDI 實現(xiàn)讀寫分離的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • SpringBoot項目打包三方JAR的示例代碼

    SpringBoot項目打包三方JAR的示例代碼

    本篇文章主要介紹了SpringBoot項目打包三方JAR的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java實現(xiàn)的計時器【秒表】功能示例

    Java實現(xiàn)的計時器【秒表】功能示例

    這篇文章主要介紹了Java實現(xiàn)的計時器【秒表】功能,結合實例形式分析了Java結合JFrame框架的計時器功能相關操作技巧,需要的朋友可以參考下
    2019-02-02

最新評論

沁阳市| 渝中区| 友谊县| 日土县| 当雄县| 饶平县| 铁岭市| 肃宁县| 吴桥县| 富裕县| 诸暨市| 海安县| 睢宁县| 图木舒克市| 鹤山市| 灵川县| 大城县| 文登市| 南京市| 镇沅| 普宁市| 保亭| 宁津县| 台湾省| 昌邑市| 靖江市| 邯郸市| 青河县| 来宾市| 大宁县| 文山县| 富蕴县| 怀柔区| 福贡县| 资中县| 运城市| 富民县| 项城市| 太湖县| 中江县| 鹿邑县|