SpringBoot基础注入@Condition使用
I. @Conditional注解
这个注解在Spring4中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean,自定义实现一个bean时只需要实现Condition接口中的matches方法即可。
public class RandBooleanCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { String type = conditionContext.getEnvironment().getProperty("conditional.rand.type"); return "boolean".equalsIgnoreCase(type); } }
使用时用
@Conditional(value= {RandBooleanCondition.class})即可
如果一个Bean是通过自动扫描加载的,是否可以直接在Bean的类上添加注解来决定是否载入呢?
@Component
@Conditional(ScanDemoCondition.class)
public class ScanDemoBean {
@Value("${conditional.demo.load}")
private boolean load;
public boolean getLoad() {
return load;
}
}
对应的判断条件如下,当配置文件中conditional.demo.load为true时,才会加载这个配置,否则不实例化
public class ScanDemoCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return "true".equalsIgnoreCase(conditionContext.getEnvironment().getProperty("conditional.demo.load"));
}
}
通过@Conditional注解配合Condition接口,来决定给一个bean是否创建和注册到Spring容器中,从而实现有选择的加载bean.
优势
这样做的目的是什么呢?
- 当有多个同名bean时,怎么抉择的问题
- 解决某些bean的创建有其他依赖条件的case
更多注解
上面可以控制bean的创建,但通过上面的流程,会发现有一点繁琐,有没有什么方式可以简化上面的流程呢?
只用一个注解就好,不要自己再来实现Condtion接口,Spring框架提供了一系列相关的注解,如下表
@ConditionalOnSingleCandidate | 当给定类型的bean存在并且指定为Primary的给定类型存在时,返回true |
@ConditionalOnMissingBean | 当给定的类型、类名、注解、昵称在beanFactory中不存在时返回true.各类型间是or的关系 |
@ConditionalOnBean | 与上面相反,要求bean存在 |
@ConditionalOnMissingClass | 当给定的类名在类路径上不存在时返回true,各类型间是and的关系 |
@ConditionalOnClass | 与上面相反,要求类存在 |
@ConditionalOnExpression | spel表达式执行为true |
@ConditionalOnProperty | 要求配置属性匹配条件 |
@ConditionalOnResource | 要求制定的资源存在 |
用例如下:当WindowsCondition.class的条件匹配时才加载bill对象到容器中。
@Conditional(value= {WindowsCondition.class})
@Bean("bill")
public Person getPerson01() {
return new Person("bill gate", 64);
}
@ConditionalOnExpression("'${business.filters}'.contains('text')")
当有多个bean时根据配置选择加载那些bean,当配置文件中business.filters中包含text时加载以上该bean,business.filters=text,image