@Conditional
作用:按照一定的条件进行判断,满足条件才在容器注册bean。
这是Spring4新提供的注解,定义:
1 2 3 4 5 6 7
| @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Conditional { Class<? extends Condition>[] value(); }
|
需要写一个类去继承 Condition 接口,并实现里面的 matches 方法:
1 2 3 4 5 6 7
| public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2); }
|
获取容器的上下文环境,conditionContext提供了多种方法,方便获取各种信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class MyCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory(); ClassLoader classLoader = conditionContext.getClassLoader(); Environment environment = conditionContext.getEnvironment(); BeanDefinitionRegistry registry = conditionContext.getRegistry(); String property = environment.getProperty("os.name"); if (property.contains("Windows")){ return true; } return false; } }
|
单个判断条件
1 2 3 4 5 6 7 8 9
| @Conditional({MyCondition.class}) public class Hello{ @Bean public Object bean1(){} @Bean public Object bean2(){} ... }
|
多个判断条件的应用
1 2 3 4 5 6 7 8 9 10
| @Conditional({ACondition.class,BCondition.class}) @Configuration public class Hello{ @Bean public Object bean1(){} @Bean public Object bean2(){} ... }
|
继@Conditional注解后,派生出 @ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnExpression、@ConditionalOnClass 等
1 2 3 4
| @ConditionalOnBean @ConditionalOnMissingBean @ConditionalOnClass @ConditionalOnMissingClass
|
@ConditionalOnBean
1 2 3 4 5 6 7 8 9 10
| @Configuration public class Hello{ @Bean(name="bean1") public Object bean1(){} @Bean(name="bean2") @ConditionalOnBean(name="bean1") public Object bean2(){} }
|
@ConditionalOnMissingBean
1 2 3 4 5 6 7 8 9 10
| @Configuration public class Hello{ @Bean(name="bean1") public Object bean1(){} @Bean(name="bean2") @ConditionalOnMissingBean(name="bean1") public Object bean2(){} }
|
在 @ConditionalOnMissingBean 的声明中,使用的也是@Conditional注解,实现了一些常用的功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented
@Conditional({OnBeanCondition.class}) public @interface ConditionalOnBean { Class<?>[] value() default {};
String[] type() default {};
Class<? extends Annotation>[] annotation() default {};
String[] name() default {};
SearchStrategy search() default SearchStrategy.ALL;
Class<?>[] parameterizedContainer() default {}; }
|
其它两个注解同理。