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);
    }
}


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号