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

Spring使用@Conditional進行條件裝配的實現(xiàn)

 更新時間:2023年12月15日 09:52:36   作者:曹朋羽  
在spring中有些bean需要滿足某些環(huán)境條件才創(chuàng)建某個bean,這個時候可以在bean定義上使用@Conditional注解來修飾,所以本文給大家介紹了Spring使用@Conditional進行條件裝配的實現(xiàn),文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下

在spring中有些bean需要滿足某些環(huán)境條件才創(chuàng)建某個bean,這個時候可以在bean定義上使用@Conditional注解來修飾。@Conditional需要指定一個條件類,這個類不需實現(xiàn)Condition接口并且實現(xiàn)其matches方法。只有當matches方法返回true時才創(chuàng)建當前bean。

例如下面定義一個bean只有當當前jdk版本大于等于8時才創(chuàng)建該bean。

bean定義這里寫的很簡單,

@Service
@Conditional(Java8Condition.class)
public class ConditionService {
}

看Java8Condition條件類

public class Java8Condition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return JavaVersion.getJavaVersion().isEqualOrNewerThan(JavaVersion.EIGHT);
    }
}

這里判斷當前java的版本,如果大于等于8則返回true,ConditionService會被創(chuàng)建成bean,否則不會創(chuàng)建該bean。

Condition的matches方法有兩個入?yún)ⅲ琧ontext和metadata。從context可以獲取beanFactory和environment信息,從metadata可以獲取當前bean上所有注解配置信息。通過這兩個參數(shù)可以獲取到很多信息了,這里就可以根據(jù)上下文來進行判斷。不如beanFacotry是否有某個bean,當前環(huán)境的profile信息,某個屬性的配置信息等等。

看到這里你是否想到了些什么,沒錯就是springboot的自動條件裝配。springboot對@Conditional進行了擴展,在org.springframework.boot.autoconfigure.condition包下有很多封裝好的條件注解。如

ConditionalOnBean:某個bean存在時

ConditionalOnClass: 某個class存在時

ConditionalOnExpression: SpEL表達式成立時

ConditionalOnJava: java環(huán)境版本

ConditionalOnProperty: 某個property值是多少時

ConditionalOnMissingBean: 某個bean不存在時

等等還有很多。這就明白為什么有些bean我們沒有顯示聲明可以直接拿來注入使用了吧。

condition的擴展

雖然springboot也封裝了很多場景的condition注解,但是難免有時候還是有些業(yè)務場景可能需要自定義conditon。這里就來以判斷上下文某個屬性值來擴展condition。

最開始看到@Conditional注解是只有一個Condition類來指定出來條件判斷邏輯,沒有額外的配置項。這里要判斷某個property必須要指定property的key和value,所以第一步先自定義一個注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
@Conditional(PropertyConditionMatcher.class)
public @interface MyPropertyCondition {
    String name();
    String value();
}

這里自定義注解PropertyConditionMatcher兩個屬性name用來指定property的key,value用來指定property的value。除此之外我們自定義的注解還用@Conditional來修飾,這樣才能我們自定義的注解才能被當作@Conditional來處理。然后來看我們的condition處理類PropertyConditionMatcher。

public class PropertyConditionMatcher implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(MyPropertyCondition.class.getName());
        String propName = (String) annotationAttributes.get("name");
        Object value = annotationAttributes.get("value");
        String property = context.getEnvironment().getProperty(propName);
        if(property != null && property.equals(value)){
            return true;
        }
        return false;
    }
}

這里還是實現(xiàn)了Condition接口。然后首先從metadata中獲取配置的property名稱和value,然后從context的Environment根據(jù)前面的property名獲取當前環(huán)境對應值,兩個value進行對比相等來判斷是否滿足條件。

然后具體條件bean上配置MyPropertyCondition。

@Service
@MyPropertyCondition(name = "condation.enable",value = "true")
public class ConditionService {
}

這樣當我們在properties文件中配置condation.enable=true時,ConditionService就會創(chuàng)建為一個bean,否則不會創(chuàng)建。

以上就是Spring使用@Conditional進行條件裝配的實現(xiàn)的詳細內容,更多關于Spring @Conditional條件裝配的資料請關注腳本之家其它相關文章!

相關文章

  • java冒泡排序和快速排序代碼

    java冒泡排序和快速排序代碼

    本文主要介紹了java冒泡排序和快速排序的實例代碼。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Java中獲取Class對象的三種方式詳解

    Java中獲取Class對象的三種方式詳解

    本文介紹了Java中獲取Class對象的三種常見方式:使用.class語法、使用Class.forName()方法以及使用.getClass()方法,需要的朋友可以參考下
    2023-12-12
  • springboot+knife4j+nacos實踐

    springboot+knife4j+nacos實踐

    這篇文章主要介紹了springboot+knife4j+nacos實踐,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Spring cloud alibaba之Gateway網(wǎng)關功能特征詳解

    Spring cloud alibaba之Gateway網(wǎng)關功能特征詳解

    spring cloud gateway是spring cloud推出的第二代網(wǎng)關,是由WebFlux+Netty+Reactor實現(xiàn)的響應式的API網(wǎng)關,它不能在傳統(tǒng)的servlet容器中工作,也不能構建成war包,接下來通過本文給大家分享Spring cloud alibaba--Gateway網(wǎng)關,需要的朋友可以參考下
    2021-08-08
  • Java多線程基本概念以及避坑指南

    Java多線程基本概念以及避坑指南

    多線程之于進程的理解,可以類比多進程之于操作系統(tǒng),多線程指在單個程序中可以同時運行多個不同的線程執(zhí)行不同的任務,這篇文章主要給大家介紹了關于Java多線程基本概念以及避坑指南的相關資料,需要的朋友可以參考下
    2021-09-09
  • 詳解Java中的時間處理與時間標準

    詳解Java中的時間處理與時間標準

    這篇文章主要為大家詳細介紹了三個時間標準GMT,CST,UTC的規(guī)定,以及Java進行時間處理的相關知識,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • Spring使用注解進行對象注入的示例詳解

    Spring使用注解進行對象注入的示例詳解

    獲取?Bean?對象也叫做對象裝配,就是把對象取出來放到某個類中,有時候也叫對象注入,常見有關對象注入的注解有兩個,一個是@Autowired,另外一個是@Resource,下面就來講講它們的具體使用吧
    2023-07-07
  • Java多線程ThreadAPI詳細介紹

    Java多線程ThreadAPI詳細介紹

    這篇文章主要介紹了Java多線程ThreadAPI詳細介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08
  • Java基于的Spire.Doc實現(xiàn)Word文檔(DOC/DOCX)文字水印添加

    Java基于的Spire.Doc實現(xiàn)Word文檔(DOC/DOCX)文字水印添加

    這篇文章主要為大家詳細介紹了Java基于的Spire.Doc實現(xiàn)Word文檔(DOC/DOCX)文字水印添加的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2026-02-02
  • Java8函數(shù)式接口的基礎學習教程

    Java8函數(shù)式接口的基礎學習教程

    這篇文章主要給大家介紹了關于Java8函數(shù)式接口基礎學習的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04

最新評論

囊谦县| 江津市| 滨州市| 肥乡县| 永城市| 理塘县| 莲花县| 龙海市| 明溪县| 闻喜县| 丹棱县| 揭东县| 江西省| 寻甸| 新源县| 华宁县| 云安县| 新平| 石林| 右玉县| 鸡东县| 八宿县| 彝良县| 胶州市| 彭州市| 彰化市| 兴义市| 轮台县| 苍梧县| 呼图壁县| 湘潭市| 新蔡县| 思南县| 台中市| 万安县| 亳州市| 大邑县| 手游| 体育| 广饶县| 吉首市|