亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring使用@Conditional進行條件裝配的實現

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

在spring中有些bean需要滿足某些環(huán)境條件才創(chuàng)建某個bean,這個時候可以在bean定義上使用@Conditional注解來修飾。@Conditional需要指定一個條件類,這個類不需實現Condition接口并且實現其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方法有兩個入參,context和metadata。從context可以獲取beanFactory和environment信息,從metadata可以獲取當前bean上所有注解配置信息。通過這兩個參數可以獲取到很多信息了,這里就可以根據上下文來進行判斷。不如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;
    }
}

這里還是實現了Condition接口。然后首先從metadata中獲取配置的property名稱和value,然后從context的Environment根據前面的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進行條件裝配的實現的詳細內容,更多關于Spring @Conditional條件裝配的資料請關注腳本之家其它相關文章!

相關文章

  • java內存異常使用導致full?gc頻繁

    java內存異常使用導致full?gc頻繁

    Full?GC是Java虛擬機中垃圾回收的一種方式,它會暫停應用程序所有的線程并清理整個堆內存。頻繁的Full?GC會導致應用程序的性能下降,甚至出現長時間的停頓。Java內存異常使用常常是Full?GC頻繁出現的原因之一,如使用大量的靜態(tài)變量、內存泄漏等。
    2023-04-04
  • Java線程優(yōu)先級示例代碼

    Java線程優(yōu)先級示例代碼

    使用過Bit下載軟件的同學應該很清楚,我們有多個下載任務同時執(zhí)行,而其中的某一個或多個是非常重要的,于是給這些任務設定一個高度優(yōu)先,以便任務可以獲取更多的帶寬盡早完成下載
    2013-09-09
  • 詳解Java正則表達式中Pattern類和Matcher類

    詳解Java正則表達式中Pattern類和Matcher類

    java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。包括兩個類Pattern和Matcher Pattern,Pattern是一個正則表達式經編譯后的表現模式。Matcher對象是一個狀態(tài)機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。
    2016-12-12
  • Springboot之restTemplate配置及使用方式

    Springboot之restTemplate配置及使用方式

    這篇文章主要介紹了Springboot之restTemplate配置及使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • java Class文件內部結構解析過程詳解

    java Class文件內部結構解析過程詳解

    java class的文件結構,java class文件結構是基于字節(jié)流的,用unicode進行編碼,下面說說java Class文件內部結構分析
    2013-11-11
  • Eclipse可視化插件WindowBuilder的安裝方法

    Eclipse可視化插件WindowBuilder的安裝方法

    這篇文章主要介紹了Eclipse可視化插件WindowBuilder的安裝方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • mybatis使用foreach標簽進行嵌套插入

    mybatis使用foreach標簽進行嵌套插入

    數據庫插入操作常見于多層架構設計中,本文提供了一個具體的實現方案,涉及三層實體類結構,第一層實體類負責基本數據結構的定義,第二層和第三層實體類則提供更詳細的業(yè)務邏輯處理,同時,文章還介紹了相應的mapper接口和配置文件設置
    2024-09-09
  • 使用Feign調用時添加驗證信息token到請求頭方式

    使用Feign調用時添加驗證信息token到請求頭方式

    這篇文章主要介紹了使用Feign調用時添加驗證信息token到請求頭方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java讀取Map的兩種方法與對比

    Java讀取Map的兩種方法與對比

    相信大家都知道在Java中Map的使用非常頻繁,我們經常會需要對Map進行遍歷和讀取,那么下面這篇文章將展示兩種遍歷的方法以及簡要分析。有需要的可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • 教你通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引

    教你通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引

    大家都知道B+Tree是從二叉樹演化而來,在這之前我們來先了解二叉樹、平衡二叉樹、平衡多叉樹,這篇文章主要介紹了通過B+Tree平衡多叉樹理解InnoDB引擎的聚集和非聚集索引,需要的朋友可以參考下
    2022-01-01

最新評論