欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot?實現自定義的?@ConditionalOnXXX?注解示例詳解

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

實現一個自定義的 @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 接口的具體實現類并實例化這些實現類,然后再執(zhí)行下面關鍵的代碼進行判斷是否需要跳過
  • if ((requiredPhase == null || requiredPhase == phase) && !condition.matches(this.context, metadata)) { return true; }
  • 上面代碼最重要的邏輯是調用 Condition 接口的具體實現類的 matches() 方法,若 matches() 返回 false,則跳過,不進行注冊 bean 的操作
  • 若 matches() 返回 true,則不跳過,進行注冊 bean 的操作

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

相關文章

最新評論