最新国产好看的视频,伊人天堂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的編寫注冊順序有關(guān)系,如果先后順序?qū)е聦霈F(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)建的問題!

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

相關(guān)文章

最新評論

盐源县| 合江县| 正镶白旗| 嵩明县| 崇礼县| 嵊州市| 西宁市| 吐鲁番市| 栾川县| 高雄县| 资溪县| 德州市| 富源县| 新津县| 雅江县| 岳池县| 田林县| 南昌县| 龙井市| 友谊县| 陆良县| 仁怀市| 郯城县| 阿荣旗| 班玛县| 四会市| 吴江市| 乌兰浩特市| 加查县| 昌都县| 巨野县| 社旗县| 贵港市| 金溪县| 河北区| 博白县| 苍南县| 墨竹工卡县| 怀化市| 瑞昌市| 墨江|