springboot注解--基础--2.2--ConditionalOnClass

文章介绍了SpringBoot中的ConditionalOnClass注解,当指定的类在classpath下存在时,该注解会触发bean的构建。在测试示例中,如果Test2.class存在,Test2bean会被注册到容器中。条件注解的匹配过程涉及到SpringBootCondition抽象类的matches方法及其子类的实现。
摘要由CSDN通过智能技术生成

springboot注解–基础–2.2–ConditionalOnClass


代码位置
https://gitee.com/DanShenGuiZu/learnDemo/tree/master/annotation-learn/annotation-learn1

1、介绍

  1. ConditionalOnClass的value对应的Class<?>[],都能在classpath下找到,就构建这个bean。
    1. 也就是说,能找到对应的class文件,就构建bean
  2. 通过class.forName来判断class能不能找到

1.1、注解内容

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnClassCondition.class)
public @interface ConditionalOnClass {

	/**
	 * // 需要匹配的类
	 * 
	 */
	Class<?>[] value() default {};

	/**
	 *  需要匹配的类名(class.forName)
	 *  
	 */
	String[] name() default {};

}

1.2、OnClassCondition类关系

在这里插入图片描述

2、测试

在这里插入图片描述

2.1、代码


 
@Configuration
public class TestConfig {
    
    @Bean
    @ConditionalOnClass(Test2.class)
    Test2 test2() {
        System.out.println("---------Test2 的class文件存在,将Test2注册到容器中---------");
        return new Test2();
    }
    
    public class Test2 {
    }
    
    public static void main(String[] args) {
        
        // 设置日志级别,去掉我不要的信息
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
        List<Logger> loggerList = loggerContext.getLoggerList();
        loggerList.forEach(logger -> {
            logger.setLevel(Level.ERROR);
        });
        
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
        
    }
}

2.2、测试

在这里插入图片描述

3、原理分析

我们通过类关系图找到Condition接口有个实现抽象类SpringBootCondition,SpringBoot中所有条件注解对应的条件类都继承这个抽象类。它实现了matches方法

在这里插入图片描述

getMatchOutcome是个抽象方法,需要子类去实现

在这里插入图片描述

子类getMatchOutcome方法

在这里插入图片描述

getCandidates方法

在这里插入图片描述

在这里插入图片描述

filter方法

在这里插入图片描述

当前类不存在,就加入matches列表中

在这里插入图片描述

ClassNameFilter方法

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值