Condition
Condition
是Spring4.0
后引入的条件化配置接口,通过实现Condition
接口可以完成有条件的加载相应的Bean
@Conditional
要配和Condition
的实现类(ClassCondition
)进行使用
属性
@Condtional
派生注解(可以看Spring
注解版原生的@Conditional
作用)
作用:必须是@Conditional
指定的条件成立,才给容器添加组件,配置里面配置的内容才会生效。
Conditional扩展注解 | 作用(判断是否满足当前指定条件) |
---|---|
ConditionalOnJava | 系统的java版本是否符合要求 |
ConditionalOnBean | 容器中存在指定Bean |
ConditionalOnMissingBean | 容器中不存在指定Bean |
ConditionalOnExpression | 满足SpEl表达式指定 |
ConditionalOnClass | 系统中存在指定的类 |
ConditionalOnMissingClass | 系统中没有指定的类 |
ConditionalOnSingleCandidate | 容器中只有一个指定的Bean,或者这个Bean是首选的Bean |
ConditionalOnProperty | 系统中指定的属性是否有指定的值 |
ConditionalOnResource | 类路径下是否存在指定的资源文件 |
ConditionalOnWebApplication | 当前是web环境 |
ConditionalOnNotWebApplication | 当前不是web环境 |
ConditionalOnJndi | JNDI存在指定项 |
自动配置类必须在一定条件下才能生效
怎么知道那些自动配置类生效
我们怎么知道那些自动配置类生效
我们可以通过使用debug=true
属性,来让控制台自动打印自动配置报告,这样我们就很方便的知道那些自动配置类生效
============================
CONDITIONS EVALUATION REPORT
============================
Positive matches:(自动配置类启用的)
-----------------
AopAutoConfiguration matched:
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
AopAutoConfiguration.ClassProxyingConfiguration matched:
- @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
egative matches:(没有启动,匹配成功的自动配置类)
-----------------
ActiveMQAutoConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)
自定义bean 根据条件创建
- 创建condition类 com.dhx.springbootcondition.condition
public class ClassCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false;
}
}
- 新建配置类 com.dhx.springbootcondition.config
@Configuration
public class UserConfig {
@Bean
public User user() {
return new User();
}
}
- 改造userConfig
@Bean
@Conditional(ClassCondition.class)
public User user() {
return new User();
}
- 测试不能自动创建user这个bean
- 改造ClassCondition。根据是否导入redis来决定是否创建userBean
public class ClassCondition implements Condition {
//通过boolean返回值,就能确定是否生成bean对象
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//业务逻辑,返回true或false来决定某个bean对象是否生成
//需求1:必须引入jedis,你的项目才生成user对象。
try {
Class.forName("redis.clients.jedis.Jedis");
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
- 测试。获取不到userBean
- 导入依赖,再测试,可以获取到userBean
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>