springboot中注解@ConditionalOnClass(A.class)当A不在classpath中时为什么不会报错

satuo20 1年前 ⋅ 176 阅读
  • @ConditionalOnClass通常与@Configuration 结合使用,意思是当classpath中存在某类时满足条件,比如我们在使用spring提供的redis时,spring提供了两种客户端实现,根据用户添加的依赖来选择对应的实现。 那么问题来了,一般我们只会添加一个实现,另一个实现就会缺失(也就是说少包),那么@ConditionalOnClass(A.class)这行代码中A.claa就会报找不到类的编译错误。那spring是怎样把这个问题解决的呢?

通过springboot的代码分析,最终发现spring的解决方法:在打包时,通过maven或gradle的optional属性,将依赖加入到打包中生成class(optional属性的依赖并没有打入到spring-boot-autoconfigration的jar包中,而是由使用方来提供)

  • 收获:spring-boot在集成很多第三方框架时都使用了这个技术,类似的还有kafka等等。我们在自己的框架中,对于可选的组件,也可以复用这个特征来实现。

全部评论: 0

    我有话说: