美文网首页
Spring注解系列六:组件注册-@Conditional

Spring注解系列六:组件注册-@Conditional

作者: dinel | 来源:发表于2020-08-25 16:08 被阅读0次

    1、创建配置类

    @Configuration
    public class MainConfig2 {
    
        /**
         * @Conditional({Condition}) : 按照一定的条件进行判断,满足条件给容器中注册bean
         * 如果系统是windows,给容器中注册("bill")
         * 如果是linux系统,给容器中注册("linus")
         */
        @Conditional(WindowsCondition.class)
        @Bean("bill")
        public Person person01(){
            return new Person("Bill Gates",62);
        }
        
        @Conditional(LinuxCondition.class)
        @Bean("linus")
        public Person person02(){
            return new Person("linus", 48);
        }
    }
    

    2、创建Condition(条件)接口的实现类

    //判断是否windows系统
    public class WindowsCondition implements Condition {
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            Environment environment = context.getEnvironment();
            String property = environment.getProperty("os.name");
            if(property.contains("Windows")){
                return true;
            }
            return false;
        }
    }
    
    //判断是否linux系统
    public class LinuxCondition implements Condition {
    
        /**
         * ConditionContext:判断条件能使用的上下文(环境)
         * AnnotatedTypeMetadata:注释信息
         */
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            // 判断是否linux系统
            //1、能获取到ioc使用的beanfactory
            ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
            //2、获取类加载器
            ClassLoader classLoader = context.getClassLoader();
            //3、获取当前环境信息
            Environment environment = context.getEnvironment();
            //4、获取到bean定义的注册类
            BeanDefinitionRegistry registry = context.getRegistry();
            
            String property = environment.getProperty("os.name");
            
            //可以判断容器中的bean注册情况,也可以给容器中注册bean
            boolean definition = registry.containsBeanDefinition("person");
            if(property.contains("linux")){
                return true;
            }
            return false;
        }
    }
    

    3、测试

    @Test
    public void test03(){
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
        String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        //动态获取环境变量的值;Windows 10
        String property = environment.getProperty("os.name");
        System.out.println(property);
        for (String name : namesForType) {
            System.out.println(name);
        }
        
        Map<String, Person> persons = applicationContext.getBeansOfType(Person.class);
        System.out.println(persons);
    }
    
    图片.png

    4、在类上添加@Conditional注解

    @Configuration
    //类中组件统一设置。满足当前条件,这个类中配置的所有bean注册才能生效;
    @Conditional(LinuxCondition.class)
    public class MainConfig2 {
    }
    
    图片.png

    相关文章

      网友评论

          本文标题:Spring注解系列六:组件注册-@Conditional

          本文链接:https://www.haomeiwen.com/subject/jgekjktx.html