6.Conditional(条件装配:满足conditional指定的条件,则进行组件注入)

条件装配:满足Conditional指定的条件,则进行组件注入

使用@ConditionalOnBean作为示例进行示范,注意执行结果和@ConditionalOnBean的位置有很大关系

1.加到方法上
    @Import({Person.class,Dog.class})
    @Configuration
    public class MyConfiguration {
        //当容器中有这个name="getperson"的组件时,才执行下面的getperson组件注册放
        @ConditionalOnBean(name = "getperson")
        @Bean
        public Person getperson(){
            return new Person("吴孟达",18);
        }
        @Bean
        public Dog getDog(){
            return new Dog("刘丹",19);
        }
    }
    测试代码:
    @SpringBootApplication
    public class MainApplication {
        public static void main(String[] args) {
            System.out.println("启动springboot项目...");
            ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
            System.out.println("启动成功!");
            //根据perosn类型获取容器中的person组件的name数组
            String[] beanNamesForType = run.getBeanNamesForType(Person.class);
            for (String s : beanNamesForType) {
                System.out.println("id:"+s);
            }
        }
    }
    输出:发现容器中只有cn.com.entity.Person这一个组件(通过@import注解注册的组件)
    id:cn.com.entity.Person
    
2.注意:如果将@ConditionalOnBean(name = "getperson")改为@ConditionalOnBean(name = "cn.com.entity.Person")呢
    即:
        @Import({Person.class,Dog.class})
        @Configuration
        public class MyConfiguration {
            //分析,此时方法上的@Import({Person.class,Dog.class})已经执行完毕,容器中已经有了cn.com.entity.Person组件,所以会执行下面的getperson方法
            @ConditionalOnBean(name = "cn.com.entity.Person")
            @Bean
            public Person getperson(){
                return new Person("吴孟达",18);
            }
            @Bean
            public Dog getDog(){
                return new Dog("刘丹",19);
            }
        }
        测试输出:发现容器中注入了两个组件( 1.@Configuration和@Bean注册的组件  2.@import注册的组件)
            id:cn.com.entity.Person
            id:getperson 
            
            
3.如果将@ConditionalOnBean加到类上时:
    @Import({Person.class,Dog.class})
    @Configuration
    //这个意思是当容器中含有cn.com.entity.Person的bean时,下面的都会执行,但是此时容器中并没有,所以输出为空,没有person类型的组件
    @ConditionalOnBean(name = "cn.com.entity.Person")
    public class MyConfiguration {
        @Bean
        public Person getperson(){
            return new Person("吴孟达",18);
        }
        @Bean
        public Dog getDog(){
            return new Dog("刘丹",19);
        }
    }

 

posted @ 2022-05-11 21:29  努力的达子  阅读(335)  评论(0编辑  收藏  举报