zoukankan      html  css  js  c++  java
  • 020 使用@Conditional注解完成条件注入

    一 .概述

    在spring之中提供@Conditional注解完成条件注入.

    我们可以实现特定的接口,完成配置类可以根据条件进行Bean的创建.


     二 .测试

    public abstract class OS {
        protected String name;
        
        public String getName() {
            return this.name;
        }
    }
    
    class Windows extends OS {
        public  Windows() {
             super.name = "windows";
        }
        
    }
    
    class Linux extends OS {
        public Linux() {
            super.name = "linux";
        }
    }

    配置类:

    @Configuration
    public class ConditionalConfig {
        
        @Bean//只用条件成立才会创建对象
        @Conditional(WindowsConditonal.class)
        public OS windows() {
            return new Windows();
        }
        
        @Bean
        @Conditional(LinuxConditional.class)
        public OS linux() {
            return new Linux();
        }
    }

    两个条件类:

    public class AbstractConditional {
        
        public String getOSName(ConditionContext context) {
            Environment environment = context.getEnvironment();
            String osName = environment.getProperty("os.name");
            return osName;
        }
    }
    public class WindowsConditonal extends AbstractConditional implements Condition{
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            if(super.getOSName(context).toUpperCase().contains("WINDOWS")) {
                return true;
            }
            return false;
        }
    
    }
    public class LinuxConditional  extends AbstractConditional implements Condition{
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            if(super.getOSName(context).toUpperCase().contains("LINUX")) {
                return true;
            }
            return false;
        }
    
    }

    只有当当前的操作系统为windows时,才会注入该bean.

    测试:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes= {ConditionalConfig.class})
    public class ConditionalTest {
        
        @Autowired
        private ApplicationContext context;
        
        @Test
        public void test() {
            System.out.println(context.getBean(OS.class).getName());
        }
    }

    结果返回为window,说明在当前的操作系统中只能创建一个Bean,另外一个Bean的声明并不会执行,否则getBean()方法会出现问题.


    三 . 总结

    [1] 如果我们想要按照一定的条件注册Bean,我们就可以使用@Conditional注解.

    [2]在使用@Conditional注解的时候,我们需要指明一个Condition接口的子类.

    [3]spring会按照Condition的实现类完成是否创建该Bean.

    [4]在本节之中,我们使用了一个环境属性的概念,这个概念在后面我们会重点说明.

  • 相关阅读:
    Python迭代器的反复使用
    快速求幂模运算实现
    rural lifestyle & city lifestyle
    Python实现 扩展的欧几里德算法求(模逆数)最大公约数
    jupyter themes一行命令设置个人最爱界面
    python数组、矩阵相乘的多种方式
    有一组整型数,其中除了2个数字以外的其它数字都是俩俩成对出现的,编写程序找出这2个不成对出现的数字。
    Linux线程池技术处理多任务
    编写函数求两个整数 a 和 b 之间的较大值。要求不能使用if, while, switch, for, ?: 以 及任何的比较语句。
    C++const类型的引用参数
  • 原文地址:https://www.cnblogs.com/trekxu/p/9094869.html
Copyright © 2011-2022 走看看