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

SpringBoot中@Conditional注解的使用

 更新時間:2024年01月04日 08:34:16   作者:Splaying  
這篇文章主要介紹了SpringBoot中@Conditional注解的使用,@Conditional注解是一個條件裝配注解,主要用于限制@Bean注解在什么時候才生效,以指定的條件形式控制bean的創(chuàng)建,需要的朋友可以參考下

1、基本介紹

  • @Conditional注解是一個條件裝配注解,主要用于限制@Bean注解在什么時候才生效。以指定的條件形式控制bean的創(chuàng)建
  • @Conditional可以自定義條件進行裝配或者不裝配…
  • @Conditional本身還是一個父注解,派生出大量的子注解;可以按需加載!
  • 因此在學習SpringBoot的時候是非常有必要學習這個注解的使用的,SpringBoot就是按需加載。
  • Conditional注解和所有子注解首先必須依托@Configuration配置類注解
  • 都可以加載類或者方法上;加載類上的含義所有的方法都按照這個條件裝配、加載方法上只有該方法進行條件裝配。
  • 注:Conditional注解是Spring4.0就有的,旗下的子注解是SpringBoot1.0有的。

2、@Conditional注解

使用Conditional注解進行條件裝配時需要自定義類實現(xiàn)Condition接口(spring包下的,不是JUC包下)

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
	// 自定義類實現(xiàn)Condition接口,完成給出指定的條件。
	Class<? extends Condition>[] value();
}

2.1、自定義條件

如果存在dog1則不會對條件裝配bean進行創(chuàng)建。

public class MyCondition implements Condition {
    /**
     * @param context: 判斷條件使用的上下文環(huán)境
     * @param metadata: 掃描的注解信息
     */
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 1. 獲取bean工廠
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // 2. 獲取運行環(huán)境, 可以根據(jù)操作系統(tǒng)的環(huán)境進行限制bean
        Environment environment = context.getEnvironment();
        // 3. 獲取BeanDefinition注冊定義表
        context.getRegistry();
        // 4. 獲取資源加載器
        context.getResourceLoader();
        // 5. 獲取類加載器
        ClassLoader classLoader = context.getClassLoader();
        if (beanFactory.containsBean("dog1")) {
            return false;
        }
        /**
         *      可以根據(jù)以上條件進行條件裝配
         *      true: 裝配
         *      false: 不裝配
         */
        return true;
    }
}

2.2、條件裝配測試

@Configuration
public class MyConfig {
    @Bean("user1")
    public User user1(){
        return new User("splay", 22, "男");
    }
    @Bean("dog1")
    //@ConditionalOnBean(name = {"dog2"})
    public Dog dog1(){
        return new Dog("金毛", 4,"公");
    }
    @Bean("dog2")
    @Conditional(value = MyCondition.class)
    public Dog dog2(){
        return new Dog("拉布拉多", 3,"母");
    }
}

在dog2上加上條件裝配,當掃描到這個bean時會進行條件判斷。

在這里插入圖片描述

3、@ConditionalOnBean子注解

子注解其實也是Conditional注解的特定裝配,只不過條件類已經(jīng)實現(xiàn)好了。

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnBeanCondition.class)			//OnBeanCondition是一個Condition接口的實現(xiàn)類
public @interface ConditionalOnBean {

	// 1. 按照bean的類型進行檢查
	Class<?>[] value() default {};

	// 2. 按照bean的類型進行檢查
	String[] type() default {};

	// 3. 按照bean的注解進行檢查
	Class<? extends Annotation>[] annotation() default {};

	// 4. 按照BeanName進行檢查
	String[] name() default {};

	// 5. 搜索策略
	SearchStrategy search() default SearchStrategy.ALL;

	// 6. 不詳
	Class<?>[] parameterizedContainer() default {};
}

3.1、條件裝配測試(一)

當容器中存在dog1的時候在創(chuàng)建dog2,否則就不會進行創(chuàng)建。

@Configuration
public class MyConfig {

    @Bean("user1")
    public User user1(){
        return new User("splay", 22, "男");
    }


    @Bean("dog1")
    public Dog dog1(){
        return new Dog("金毛", 4,"公");
    }

    @Bean("dog2")
    @ConditionalOnBean(name = {"dog1"})
    public Dog dog2(){
        return new Dog("拉布拉多", 3,"母");
    }
}

在這里插入圖片描述

3.2、條件裝配測試(二)

在使用時發(fā)現(xiàn)條件裝配與bean的編寫注冊順序有關系,如果先后順序導致將會出現(xiàn)失敗的情況。

@Configuration
public class MyConfig {

    @Bean("user1")
    public User user1(){
        return new User("splay", 22, "男");
    }


    @Bean("dog1")
    @ConditionalOnBean(name = {"dog2"})		//當有dog2組件的時候創(chuàng)建dog1
    public Dog dog1(){
        return new Dog("金毛", 4,"公");
    }

    @Bean("dog2")
    public Dog dog2(){
        return new Dog("拉布拉多", 3,"母");
    }
}

在這里插入圖片描述

對比上面測試一發(fā)現(xiàn)dog1并沒有成功創(chuàng)建,猜測創(chuàng)建的時候估計是按照某種順序進行的!

因此在使用條件裝配進行創(chuàng)建的時候一定要注意唄依賴的條件是否要先創(chuàng)建的問題!

到此這篇關于SpringBoot 中@Conditional注解的使用的文章就介紹到這了,更多相關@Conditional注解使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java數(shù)據(jù)結構及算法實例:考拉茲猜想 Collatz Conjecture

    Java數(shù)據(jù)結構及算法實例:考拉茲猜想 Collatz Conjecture

    這篇文章主要介紹了Java數(shù)據(jù)結構及算法實例:考拉茲猜想 Collatz Conjecture,本文直接給出實現(xiàn)代碼,代碼中包含詳細注釋,需要的朋友可以參考下
    2015-06-06
  • Java使用MulticastSocket實現(xiàn)群聊應用程序

    Java使用MulticastSocket實現(xiàn)群聊應用程序

    這篇文章主要為大家詳細介紹了Java使用MulticastSocket實現(xiàn)群聊應用程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java設計模式之原型設計示例詳解

    Java設計模式之原型設計示例詳解

    這篇文章主要為大家詳細介紹了Java的原型設計模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • SpringBoot實現(xiàn)接口防刷的兩種方法

    SpringBoot實現(xiàn)接口防刷的兩種方法

    接口被刷指的是同一接口被頻繁調用,可能是由于以下原因導致:惡意攻擊和誤操作或程序錯誤,本文給大家介紹了SpringBoot實現(xiàn)接口防刷的兩種方法,并有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • 利用maven-shade-plugin插件解決不兼容的依賴沖突的情況

    利用maven-shade-plugin插件解決不兼容的依賴沖突的情況

    本文介紹了在Maven工程中遇到底層依賴包版本沖突問題,使用maven-shade-plugin插件解決沖突的方法,并詳細描述了步驟及注意事項
    2026-05-05
  • RabbitMQ的安裝和配置可視化界面的詳細步驟

    RabbitMQ的安裝和配置可視化界面的詳細步驟

    這篇文章主要介紹了RabbitMQ的安裝和配置可視化界面的詳細步驟,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Mybatis中collection和association的使用區(qū)別詳解

    Mybatis中collection和association的使用區(qū)別詳解

    這篇文章主要介紹了Mybatis中collection和association的使用區(qū)別詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java高并發(fā)之CyclicBarrier的用法詳解

    Java高并發(fā)之CyclicBarrier的用法詳解

    CyclicBarrier 是 Java 中的一種同步工具,它可以讓多個線程在一個屏障點處等待,直到所有線程都到達該點后,才能繼續(xù)執(zhí)行。本文就來和大家聊聊它的用法,需要的可以參考一下
    2023-03-03
  • 詳解Java的readBytes是怎么實現(xiàn)的

    詳解Java的readBytes是怎么實現(xiàn)的

    眾所周知,Java是一門跨平臺語言,針對不同的操作系統(tǒng)有不同的實現(xiàn),下面小編就來從一個非常簡單的api調用帶大家來看看Java具體是怎么做的吧
    2023-07-07
  • Java SE使用數(shù)組實現(xiàn)高速數(shù)字轉換功能

    Java SE使用數(shù)組實現(xiàn)高速數(shù)字轉換功能

    隨著大數(shù)據(jù)時代的到來,數(shù)字轉換功能變得越來越重要,在Java開發(fā)中,數(shù)字轉換功能也是經(jīng)常用到的,下面我們就來學習一下如何使用Java SE數(shù)組實現(xiàn)高速的數(shù)字轉換功能吧
    2023-11-11

最新評論

黔西县| 葵青区| 光山县| 通化县| 星子县| 绍兴县| 威远县| 灌阳县| 楚雄市| 中超| 偏关县| 淮北市| 故城县| 琼中| 盘山县| 武义县| 伊吾县| 益阳市| 海林市| 斗六市| 湟中县| 诸暨市| 镇坪县| 兴义市| 宣化县| 阳朔县| 珲春市| 上虞市| 合山市| 青岛市| 工布江达县| 定兴县| 庄浪县| 余庆县| 江安县| 枞阳县| 方城县| 峨眉山市| 通化市| 伊宁市| 元谋县|