@Conditional自动配置报告

Condition

ConditionSpring4.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环境
ConditionalOnJndiJNDI存在指定项

自动配置类必须在一定条件下才能生效

怎么知道那些自动配置类生效

我们怎么知道那些自动配置类生效
我们可以通过使用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 根据条件创建

  1. 创建condition类 com.dhx.springbootcondition.condition
public class ClassCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return false;
    }
}
  1. 新建配置类 com.dhx.springbootcondition.config
@Configuration
public class UserConfig {

    @Bean
    public User user() {
        return new User();
    }

}
  1. 改造userConfig
@Bean
    @Conditional(ClassCondition.class)
    public User user() {
        return new User();
    }
  1. 测试不能自动创建user这个bean
  2. 改造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;
        }

    }
}
  1. 测试。获取不到userBean
  2. 导入依赖,再测试,可以获取到userBean
 <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值