springboot注解–基础–2.2–ConditionalOnClass
代码位置
https://gitee.com/DanShenGuiZu/learnDemo/tree/master/annotation-learn/annotation-learn1
1、介绍
- ConditionalOnClass的value对应的Class<?>[],都能在classpath下找到,就构建这个bean。
- 也就是说,能找到对应的class文件,就构建bean
- 通过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列表中