@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

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐