1.说明:基于条件,判断是否实例化对象,注入容器中,组合@bean注解使用和扫描。

2.源代码

        @Target({ElementType.TYPE, ElementType.METHOD}) // 注解在类、方法使用
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        public @interface Conditional {

            Class<? extends Condition>[] value(); // 1.注解值必须继承Condition,2.值为单个值或数组

        }
    @FunctionalInterface
        public interface Condition {
            boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);//返回false,条件不成立。目标动作不执行,返回true,条件成立执行目标动作。
        }

 

3.使用方式:创建 Condition 的实现类 TsetCondition,使用@Condition(value= TsetCondition.class)

1.使用在类:条件成立实例化对象,注入容器

基于条件创建被标注的类,可以结合 @Service ,@Component ,@Controller 三个注解使用,条件成立,创建实例。

          @Component
                @Conditional(value = TestCondition.class)
                public class Tst  {
                    @Scheduled(fixedRate = 5000)
                    public  void  getStr() {
                        System.err.println("我的scheduled 执行了");
                    }
                }

也可以结合 @Configuration ,@Bean 基于配置文件,条件不成立@Configuration标注的类不创建,类下被标注的@Bean方法不执行

                @Configuration
                @Conditional(value = TestCondition.class)
                public class TestConfiguration {
                    
                    @Bean
                    public Tst createTst() {
                        return new Tst();
                    }
                }

2.在方法上使用

结合@Bean注解使用 ,条件成立方法执行,创建对象实例。

            @Configuration
            public class TestConfiguration {
                
                @Bean
                @Conditional(value = TestCondition.class)
                public Tst createTst() {  // 基于条件实例化Bean
                    return new Tst();
                }
                
                @Bean
                public Tst2 createTst2() { //没有条件、只要系统启动就会创建Tst2实例
                    return new Tst2();
                }
            }

3.多条件件使用(方法和类):会执行每个 Condition的 matches ,如果有一个返回false ,条件不成立目标不执行

            @Configuration
            public class TestConfiguration {
                
                @Bean
                @Conditional(value = {TestCondition.class,TestCondition2.class})
                public Tst createTst() {  // 基于条件实例化Bean,只有 TestCondition 、TestCondition2 都返回true才实例化对象,就是说,value集合中只要有一个Condition不成立,就不会实例对象
                    return new Tst();
                }
            }

 

posted on 2019-07-23 14:48  JonRain0625  阅读(682)  评论(0编辑  收藏  举报