@ConditionalOnClass编译问题

@ConditionalOnClass/@ConditionalOnMissingClass

使用场景

和@Configuration一起使用,用于条件注入

问题一

为什么我们使用的第三方jar中,指定的类型不存在,第三方jar在编译时仍然通过?还打出了jar包?

下图为spring-boot-autoconfigure中的一个配置类SecurityDataConfiguration。为什么SecurityEvaluationContextExtension不存在,但是spring-boot-autoconfigure在编译打包时却能成功?

在这里插入图片描述

其实这里有个误区,spring-boot-autoconfigure在编译打包时,SecurityEvaluationContextExtension是存在的。

spring-boot-autoconfiguremaven中导入了SecurityEvaluationContextExtension所在jar的坐标,所以可以通过编译。但是在maven中导入这个jar包时指定了<optional>true</optional>,所以依赖不会传递到我们的工程。我们在自己的项目中看到的就是报错的状态。

问题二

为什么在我们的项目中看到SecurityDataConfiguration类是报错的状态,但是我们的项目却仍然能编译打包成功?

这是另外一个问题。实际上我们使用的并不是SecurityDataConfiguration.java这个文件;我们的项目中引入spring-boot-autoconfigurejar包后,使用的是它的.class字节码文件。所以实际上我们使用的是SecurityDataConfiguration.class这个文件。我们的项目在编译打包时并不会去再次编译SecurityDataConfiguration.java这个文件,所以报错不会对我们的项目产生影响。

在这里插入图片描述

Reference

注解@ConditionalOnClass(X.class),X不存在时的探究

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值