日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

SpringBoot中condition注解的使用

發(fā)布時(shí)間:2024/1/18 javascript 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot中condition注解的使用 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在項(xiàng)目中,有時(shí)會(huì)遇到我們的Configuration、Bean、Service等等的bean組件需要依條件按需加載的情況。
springboot中提供了一系列@Condition* 注解來(lái)處理有條件注入的情況。

1. 說(shuō)明

Spring4中增加了@Condition annotation, 使用該Annotation之后,在做依賴注入的時(shí)候,會(huì)檢測(cè)是否滿足某個(gè)條件來(lái)決定是否注入某個(gè)類。
springboot基于spring4的這個(gè)注解實(shí)現(xiàn)了多個(gè)用于判斷的條件注解,如果我們?cè)谑褂弥羞@些注解無(wú)法滿足我們的要求還可以使用@Conditional自定義條件注解

2. 常用的條件注解

條件注解對(duì)應(yīng)的Condition 處理類處理邏輯
@ConditionalOnBeanOnBeanConditionSpring容器中是否存在對(duì)應(yīng)的實(shí)例。可以通過(guò)實(shí)例的類型、類名、注解、昵稱去容器中查找(可以配置從當(dāng)前容器中查找或者父容器中查找或者兩者一起查找)
@ConditionalOnClassOnClassCondition類加載器中是否存在對(duì)應(yīng)的類。可以通過(guò)Class指定(value屬性)或者Class的全名指定(name屬性)如果是多個(gè)類或者多個(gè)類名的話,關(guān)系是”與”關(guān)系,也就是說(shuō)這些類或者類名都必須同時(shí)在類加載器中存在
@ConditionalOnExpressionOnExpressionCondition判斷SpEL 表達(dá)式是否成立
@ConditionalOnMissingBeanOnBeanConditionSpring容器中是否缺少對(duì)應(yīng)的實(shí)例。可以通過(guò)實(shí)例的類型、類名、注解、昵稱去容器中查找(可以配置從當(dāng)前容器中查找或者父容器中查找或者兩者一起查找)
@ConditionalOnMissingClassOnClassCondition跟ConditionalOnClass的處理邏輯一樣,只是條件相反,在類加載器中不存在對(duì)應(yīng)的類
@ConditionalOnPropertyOnPropertyCondition應(yīng)用環(huán)境中的屬性是否存在。提供prefix、name、havingValue以及matchIfMissing屬性。prefix表示屬性名的前綴,name是屬性名,havingValue是具體的屬性值,matchIfMissing是個(gè)boolean值,如果屬性不存在,這個(gè)matchIfMissing為true的話,會(huì)繼續(xù)驗(yàn)證下去,否則屬性不存在的話直接就相當(dāng)于匹配不成功
@ConditionalOnResourceOnResourceCondition是否存在指定的資源文件。只有一個(gè)屬性resources,是個(gè)String數(shù)組。會(huì)從類加載器中去查詢對(duì)應(yīng)的資源文件是否存在
@ConditionalOnSingleCandidateOnBeanConditionSpring容器中是否存在且只存在一個(gè)對(duì)應(yīng)的實(shí)例。只有3個(gè)屬性value、type、search。跟ConditionalOnBean中的這3種屬性值意義一樣
@ConditionalOnWebApplicationOnWebApplicationCondition應(yīng)用程序是否是Web程序,沒(méi)有提供屬性,只是一個(gè)標(biāo)識(shí)。會(huì)從判斷Web程序特有的類是否存在,環(huán)境是否是Servlet環(huán)境,容器是否是Web容器等

舉例

例子說(shuō)明
@ConditionalOnBean(javax.sql.DataSource.class)Spring容器或者所有父容器中需要存在至少一個(gè)javax.sql.DataSource類的實(shí)例
@ConditionalOnClass({ Configuration.class,FreeMarkerConfigurationFactory.class })類加載器中必須存在Configuration和FreeMarkerConfigurationFactory這兩個(gè)類
@ConditionalOnExpression(“’${server.host}’==’localhost’”)server.host配置項(xiàng)的值需要是localhost
ConditionalOnJava(JavaVersion.EIGHT)Java版本至少是8
@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)Spring當(dāng)前容器中不存在ErrorController類型的bean
@ConditionalOnMissingClass(“GenericObjectPool”)類加載器中不能存在GenericObjectPool這個(gè)類
@ConditionalOnNotWebApplication必須在非Web應(yīng)用下才會(huì)生效
@ConditionalOnProperty(prefix = “spring.aop”, name = “auto”, havingValue = “true”, matchIfMissing = true)應(yīng)用程序的環(huán)境中必須有spring.aop.auto這項(xiàng)配置,且它的值是true或者環(huán)境中不存在spring.aop.auto配置(matchIfMissing為true)
@ConditionalOnResource(resources=”mybatis.xml”)類加載路徑中必須存在mybatis.xml文件
@ConditionalOnSingleCandidate(PlatformTransactionManager.class)Spring當(dāng)前或父容器中必須存在PlatformTransactionManager這個(gè)類型的實(shí)例,且只有一個(gè)實(shí)例
@ConditionalOnWebApplication必須在Web應(yīng)用下才會(huì)生效

3.自定義條件注解

實(shí)現(xiàn)條件化注解我們需要兩個(gè)類

  • 自定義注解類
    定義注解,指定判斷用的條件類
  • 條件類
    實(shí)現(xiàn)org.springframework.context.annotation.Condition接口,定義判斷條件

舉例說(shuō)明:
1.定義注解類MyConditionalOnProperty
要使用注解@Conditional(MyOnPropertyCondition.class),MyOnPropertyCondition為我們要定義的條件類

@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) @Documented @Conditional(MyOnPropertyCondition.class) public @interface MyConditionalOnProperty {String value();String prefix() default "";String havingValue() default "";boolean matchIfMissing() default false;boolean relaxedNames() default true;//TODO ADD ONE PROPERTYString havingValue() default ""; }

2.定義條件類:

public class MyOnPropertyCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(MyConditionalOnProperty.class.getName());String propertyName = (String) annotationAttributes.get("value");String value = annotationAttributes.get("havingValue");String propertyValue = context.getEnvironment().getProperty(propertyName);if (propertyValue.equalsIgnoreCase(value)) {return true;}return false;} }

3.調(diào)用

@Configurationpublic class MyConfig {@Bean@MyConditionalOnProperty(value = "env",havingValue = "dev")public Person person(){log.info("創(chuàng)建Bean");return new Person();}}

總結(jié)

以上是生活随笔為你收集整理的SpringBoot中condition注解的使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。