zoukankan      html  css  js  c++  java
  • Spring的Conditional注解

    Spring的Conditional注解

    源码

    @Target({ElementType.TYPE, ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Conditional {
    
    	/**
    	 * All {@link Condition Conditions} that must {@linkplain Condition#matches match}
    	 * in order for the component to be registered.
    	 */
    	Class<? extends Condition>[] value();
    
    }
    
    

    说明

    作用:
    它的作用是根据条件选择注入的bean对象。
    属性:
    value:
    用于提供一个Condition接口的实现类,实现类中需要编写具体代码实现注入的条件。
    使用场景:
    当我们在开发时,可能会使用多平台来测试,例如我们的测试数据库分别部署到了linux和windows两个操作系统上面,现在根据我们的工程运行环境选择连接的数据库。此时就可以使用此注解。同时基于此注解引出的@Profile注解,就是根据不同的环境,加载不同的配置信息。
    

    示例

    /**
     * @author WGR
     * @create 2020/9/16 -- 20:13
     */
    public class JdbcConfig {
    
        @Value("${jdbc.driver}")
        private String driver;
        @Value("${jdbc.url}")
        private String url;
        @Value("${jdbc.username}")
        private String username;
        @Value("${jdbc.password}")
        private String password;
    
        /**
         * linux系统注入的数据源
         *
         * @param lDriver
         * @param lUrl
         * @param lUsername
         * @param lPassword
         * @return
         */
        @Bean("dataSource")
        @Conditional(LinuxCondition.class)
        public DataSource createLinuxDataSource(@Value("${linux.driver}") String
                                                        lDriver,
                                                @Value("${linux.url}") String lUrl,
                                                @Value("${linux.username}") String
                                                        lUsername,
                                                @Value("${linux.password}") String
                                                        lPassword) {
            DriverManagerDataSource dataSource = new
                    DriverManagerDataSource(lUrl, lUsername, lPassword);
            dataSource.setDriverClassName(lDriver);
            return dataSource;
        }
    
        @Bean("dataSource")
        @Conditional(WindowsCondition.class)
        public DataSource createWindowsDataSource() {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(driver);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            return dataSource;
        }
    
    }
    
    /**
     * @author WGR
     * @create 2020/9/16 -- 20:16
     */
    public class LinuxCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata
                metadata) {
            //获取ioc使用的beanFactory
            ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
              //获取类加载器
            ClassLoader classLoader = context.getClassLoader();
           //获取当前环境信息
            Environment environment = context.getEnvironment();
            //获取bean定义的注册类
            BeanDefinitionRegistry registry = context.getRegistry();
           //获得当前系统名
            String property = environment.getProperty("os.name");
            //包含Windows则说明是windows系统,返回true
            if (property.contains("Linux")) {
                return true;
            }
            return false;
        }
    }
    
    /**
     * @author WGR
     * @create 2020/9/16 -- 20:17
     */
    public class WindowsCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
         //获取ioc使用的beanFactory
            ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
            //获取类加载器
            ClassLoader classLoader = context.getClassLoader();
            //获取当前环境信息
            Environment environment = context.getEnvironment();
            /**
            * 获取所有系统环境变量
            */
            if (environment instanceof StandardEnvironment) {
                StandardEnvironment standardEnvironment = (StandardEnvironment) environment;
                Map<String, Object> map = standardEnvironment.getSystemProperties();
                for (Map.Entry<String, Object> me : map.entrySet()) {
                    System.out.println(me.getKey() + "," + me.getValue());
                }
            }
           //获取bean定义的注册类
            BeanDefinitionRegistry registry = context.getRegistry();
    
            String[] beanDefinitionNames = registry.getBeanDefinitionNames();
            Arrays.asList(beanDefinitionNames).forEach(l ->{
                System.out.println(l);
            });
            //获得当前系统名
            String property = environment.getProperty("os.name");
            //包含Windows则说明是windows系统,返回true
            if (property.contains("Windows")) {
                return true;
            }
            return false;
        }
    }
    
    
    /**
     * @author WGR
     * @create 2020/9/14 -- 20:41
     */
    @Configuration
    @PropertySource({"jdbc.properties","linuxjdbc.properties"})
    @Import(JdbcConfig.class)
    public class SpirngConfigure {
    }
    
    

    进行测试:

    public class TestSpring5 {
    
        public static void main(String[] args) {
            //1.获取容器
            AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("com.dalianpai.spring5.conditional");
            //2.根据id获取对象
            DataSource dataSource = ac.getBean("dataSource", DataSource.class);
        }
    
    
    }
    

  • 相关阅读:
    经典的标量子查询
    Perl 正则二
    v$sql和v$sqlarea
    Flex中TabNavigator隐藏和显示选项卡
    如何优化buffer_cache
    perl 限制用户操作
    perl 正则
    latch 为什么消耗CPU
    Oracle 写脏数据的不同场景
    block放入哪个hash bucket算法
  • 原文地址:https://www.cnblogs.com/dalianpai/p/13681448.html
Copyright © 2011-2022 走看看