Spring学习之@Conditional
注解说明 @Conditional 是 Spring 提供的用于判断是否对 Bean 注入的条件注解(在4.0后版本引入),只有满足了所有的条件,一个 bean 才会被注册成功并使用。此注解可标注在类上、元注解上、@Bean方法上,通常与 @Configuration 注解配合使用,标识在 @Configuration 注解上的 @Conditional 会影响此配置类的所有 @Bean 注解方法、@Import 注解和@ComponentScan 注解。另需注意 @Conditional 注解不支持继承 对于标注在元注解上的样例,可查看 SpringBoot 项目下的 org.springframework.boot.autoconfigure.condition 包以 ConditionalOn 开头的类 注解属性 此注解只有一个属性 value ,返回类型为 Class 数组,它用来配置所有的 Condition 类信息 Condition 是 Spring 提供的一个接口,它提供了 matches 方法来提供判断的依据逻辑,对于其参数 ConditionContext 提供了丰富的上下文信息 测试代码 @Configuration @ComponentScan(basePackages = "cn.imcompany.bean.condition") public class MyConfiguration { @Bean @ConditionalOnDate public MyBean myBean() { return new MyBean(); } @Bean public MyBean2 myBean2() { return new MyBean2(); } @Bean @Conditional(ConfigPropertyCondition.class) public MyBean5 myBean5() { return new MyBean5(); } } @Configuration @Conditional(ConfigPropertyCondition.class) public class MyConfigConfiguration { @Bean public MyBean3 myBean3() { return new MyBean3(); } @Bean public MyBean4 myBean4() { return new MyBean4(); } } public class MyDateCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { LocalDateTime now = LocalDateTime.now(); int minute = now.getMinute(); return minute % 2 == 0; // 每隔两分钟满足条件 } } @Retention(java.lang.annotation.RetentionPolicy.RUNTIME) @Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD}) @Documented @Conditional(MyDateCondition.class) public @interface ConditionalOnDate { } public class ConfigPropertyCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return "true".equals(System.getProperty("my.config.property")); } } public class Main { public static void main(String[] args) { System.setProperty("my.config.property", "true"); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class); for (String beanDefinitionName : context.getBeanDefinitionNames()) { System.out.println("beanDefinitionName = " + beanDefinitionName); } } } 源码阅读 对于 Configuration 类条件处理分为两个阶段: ...