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

SpringBoot?實現(xiàn)自定義的?@ConditionalOnXXX?注解示例詳解

 更新時間:2022年08月31日 10:01:35   作者:tytler  
這篇文章主要介紹了SpringBoot?實現(xiàn)自定義的?@ConditionalOnXXX?注解,通過示例代碼介紹了實現(xiàn)一個自定義的?@Conditional?派生注解,Conditional?派生注解的類如何注入到?spring?容器,需要的朋友可以參考下

實現(xiàn)一個自定義的 @Conditional 派生注解

自定義一個注解,繼承 @Conditional 注解

// 派生注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Documented
@Conditional(CustomConditional.class)
public @interface ConditionalOnCustom {
    String[] value() default {};
}

注解的處理類

public class CustomConditional implements Condition {

	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		// 獲取到自定義注解中的 value 值
		String[] properties = (String[]) metadata.getAnnotationAttributes("smoketest.test.condition.ConditionalOnCustom").get("value");
		// 遍歷自定義屬性的 value 值
		for (String property : properties) {
			// 獲取定義在配置文件中的值,并且 equals("customBean") 則返回 true
			if ("customBean".equals(context.getEnvironment().getProperty(property))) {
				return true;
			}
		}
		return false;
	}
}

使用注解

@Component
@ConditionalOnCustom({"smoketest.test.condition.bean"})
public class ConditionalUse {
}

application.properties 中配置變量

smoketest.test.condition.bean = customBean

獲取 ConditionalUse 對象

@SpringBootApplication
@ConfigurationPropertiesScan
public class SampleTestApplication {

	public static void main(String[] args) {
		ConfigurableApplicationContext context = SpringApplication.run(SampleTestApplication.class, args);
		ConditionalUse bean = context.getBean(ConditionalUse.class);
		System.out.println(bean);
	}

}

程序啟動可以看到成功獲取 ConditionalUse 對象

Conditional 派生注解的類如何注入到 spring 容器

@Conditional 注解在 spring 的 ConfigurationClassParse 類中會調用 ConditionEvaluator.shouldSkip() 方法進行判斷,Condition 接口的 matches() 是否返回 true,如果返回 true,就實例化對象,并注冊到 spring 容器中

  • shouldSkip() 這個方法執(zhí)行的邏輯主要是如果是解析階段則跳過,如果是注冊階段則不跳過
  • 如果是在注冊階段即 REGISTER_BEAN 階段的話,此時會得到所有的 Condition 接口的具體實現(xiàn)類并實例化這些實現(xiàn)類,然后再執(zhí)行下面關鍵的代碼進行判斷是否需要跳過
  • if ((requiredPhase == null || requiredPhase == phase) && !condition.matches(this.context, metadata)) { return true; }
  • 上面代碼最重要的邏輯是調用 Condition 接口的具體實現(xiàn)類的 matches() 方法,若 matches() 返回 false,則跳過,不進行注冊 bean 的操作
  • 若 matches() 返回 true,則不跳過,進行注冊 bean 的操作

到此這篇關于SpringBoot 實現(xiàn)自定義的 @ConditionalOnXXX 注解示例詳解的文章就介紹到這了,更多相關SpringBoot @ConditionalOnXXX 注解內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

辽宁省| 高碑店市| 峨边| 怀化市| 霸州市| 娄底市| 个旧市| 阜平县| 阜新| 河池市| 乌兰浩特市| 荥经县| 荆州市| 长岭县| 佳木斯市| 黄石市| 喜德县| 达孜县| 吴川市| 威远县| 浦江县| 永康市| 鹿泉市| 平阴县| 广汉市| 合川市| 东宁县| 齐齐哈尔市| 孝昌县| 炎陵县| 兴文县| 武城县| 中牟县| 房产| 英山县| 丹江口市| 江门市| 河间市| 白水县| 怀安县| 南平市|