@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)为什么不报错

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐