@ConditionalOnClass使用方法
@ConditionalOnClass
指定的类不存在,编译为什么可以通过?
重点在optional
,可选,不进行maven的依赖传递
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
<optional>true</optional>
</dependency>
@ConditionalOnClass
注解作用在class
上是可靠,例如@ConditionalOnClass(SecurityUtils.class)
;作用在method
上是不可靠的,若必须作用要作用在方法上,建议使用name属性指定全限类名,例如@ConditionalOnClass(name = {"org.apache.shiro.SecurityUtils"})
springboot 通过ConfigurationClassBeanDefinitionReader读取@Configuration注解标识的类。在扫描候选资源时,spring并没有通过Classloader#loadClass()来加载class文件,而是通过Classloader.getResource()获得class二进制文件,通过ClassReader对二进制文件进行ASM语法解析,从而得到候选类和注解的元数据。也就是说在spring扫描需要加载的Bean时,所有候选类都没有加载初始化。
参考:
注解@ConditionalOnClass(X.class),X不存在时的探究
@ConditionalOnClass(A.class)为什么不报错