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

SpringBoot中condition注解的使用方式

 更新時間:2024年03月28日 10:48:09   作者:刀不封  
這篇文章主要介紹了SpringBoot中condition注解的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

在項(xiàng)目中,有時會遇到我們的Configuration、Bean、Service等等的bean組件需要依條件按需加載的情況。

springboot中提供了一系列@Condition* 注解來處理有條件注入的情況。

說明

Spring4中增加了@Condition annotation, 使用該Annotation之后,在做依賴注入的時候,會檢測是否滿足某個條件來決定是否注入某個類。

springboot基于spring4的這個注解實(shí)現(xiàn)了多個用于判斷的條件注解,如果我們在使用中這些注解無法滿足我們的要求還可以使用@Conditional自定義條件注解

常用的條件注解

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

舉例

例子說明
@ConditionalOnBean(javax.sql.DataSource.class)Spring容器或者所有父容器中需要存在至少一個javax.sql.DataSource類的實(shí)例
@ConditionalOnClass({ Configuration.class,FreeMarkerConfigurationFactory.class })類加載器中必須存在Configuration和FreeMarkerConfigurationFactory這兩個類
@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這個類
@ConditionalOnNotWebApplication必須在非Web應(yīng)用下才會生效
@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這個類型的實(shí)例,且只有一個實(shí)例
@ConditionalOnWebApplication必須在Web應(yīng)用下才會生效

自定義條件注解

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

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

舉例說明

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 PROPERTY
    String havingValue() default "";
}

2.定義條件類:

public class MyOnPropertyCondition implements Condition {
    @Override
    public 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)用

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

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springmvc 參數(shù)綁定總結(jié)

    springmvc 參數(shù)綁定總結(jié)

    本篇文章主要介紹了詳解springmvc 參數(shù)綁定,詳細(xì)的介紹了springmvc各種參數(shù)綁定的情況,具有一定的參考價值,有興趣的可以了解一下。
    2017-03-03
  • 使用aop實(shí)現(xiàn)全局異常處理

    使用aop實(shí)現(xiàn)全局異常處理

    這篇文章主要為大家詳細(xì)介紹了使用aop實(shí)現(xiàn)全局異常處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Java跳出多重嵌套循環(huán)代碼實(shí)例

    Java跳出多重嵌套循環(huán)代碼實(shí)例

    這篇文章主要介紹了Java跳出多重嵌套循環(huán),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java微信獲取用戶資料報錯48001解決辦法

    Java微信獲取用戶資料報錯48001解決辦法

    這篇文章主要介紹了Java微信獲取用戶資料報錯48001的解決辦法,這個問題大家在工作可能經(jīng)常會遇到,文中通過示例代碼將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之快速冪的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之快速冪的實(shí)現(xiàn)

    快速冪是用來解決求冪運(yùn)算的高效方式。本文將詳細(xì)為大家介紹如何利用Java實(shí)現(xiàn)快速冪,以及利用快速冪求解冪運(yùn)算問題,需要的可以參考一下
    2022-03-03
  • 詳解Maven項(xiàng)目缺少M(fèi)aven Dependencies解決方法總結(jié)

    詳解Maven項(xiàng)目缺少M(fèi)aven Dependencies解決方法總結(jié)

    這篇文章主要介紹了詳解Maven項(xiàng)目缺少M(fèi)aven Dependencies解決方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Springboot解決no main manifest attribute錯誤

    Springboot解決no main manifest attribute錯誤

    在開發(fā)Springboot項(xiàng)目時,使用java -jar命令運(yùn)行jar包可能出現(xiàn)no main manifest attribute錯誤,本文就來介紹一下該錯誤的解決方法,感興趣的可以了解一下
    2024-09-09
  • SpringCloud使用Nacos 配置中心實(shí)現(xiàn)配置自動刷新功能使用

    SpringCloud使用Nacos 配置中心實(shí)現(xiàn)配置自動刷新功能使用

    SpringCloud項(xiàng)目中使用Nacos作為配置中心可以方便開發(fā)及運(yùn)維人員隨時查看配置信息,及配置共享,并且Nacos支持配置信息實(shí)時刷新,非常方便,下面給大家介紹SpringCloud使用Nacos配置中心實(shí)現(xiàn)配置自動刷新功能使用,感興趣的朋友一起看看吧
    2025-05-05
  • springboot 在ftl頁面上使用shiro標(biāo)簽的實(shí)例代碼

    springboot 在ftl頁面上使用shiro標(biāo)簽的實(shí)例代碼

    這篇文章主要介紹了springboot 在ftl頁面上使用shiro標(biāo)簽的實(shí)例代碼,通過文字說明結(jié)合實(shí)例的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2018-05-05
  • Java Date與String的相互轉(zhuǎn)換詳解

    Java Date與String的相互轉(zhuǎn)換詳解

    這篇文章主要介紹了Java Date與String的相互轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評論

大关县| 惠来县| 怀远县| 丘北县| 溧水县| 荃湾区| 兴国县| 肇东市| 凤城市| 岑巩县| 镇沅| 龙井市| 文山县| 思南县| 南康市| 东光县| 阿鲁科尔沁旗| 永福县| 沙湾县| 吐鲁番市| 镇远县| 太仆寺旗| 伽师县| 台前县| 绩溪县| 府谷县| 葫芦岛市| 炉霍县| 富蕴县| 新田县| 汉源县| 米泉市| 蛟河市| 铅山县| 密云县| 延吉市| 临江市| 嘉定区| 望奎县| 肥西县| 瑞昌市|