SpringBoot @Bean 和 @ConditionalOnClass 同时使用

有时候会希望存在指定类型时才注入某个 Bean:

@AutoConfiguration
public class MyAutoConfiguration {
@Bean
@ConditionalOnClass(MyService.class)
public MyConditionalBean statistics() {
return new MyConditionalBean();
}
}

但是如果按照上述代码,当MyService不存在的时候,程序会直接找不到类,导致程序无法启动。

你会发现@ConditionalOnClass用在被@Configuration标注的类上,即使MyService不存在,程序也会正常启动。但是像上面那样就不行。

这是因为和@Configuration一起使用@ConditionalOnClass时,其注解信息通过 ASM 解析,但是在处理和@Bean一起用的@ConditionalOnClass时,所在的配置类已经被 JVM 加载了,也就是加载在解析的前面,而要加载成功,首先要能够找到@ConditionalOnClass所指明的类。

有两种解决方法:

  1. 指定全类名

    @Bean
    @ConditionalOnClass(name ="com.example.MyService")
    public MyConditionalBean statistics() {
    return new MyConditionalBean();
    }
  2. 内嵌配置类

    @AutoConfiguration
    public class MyAutoConfiguration {
    @Configuration
    @ConditionalOnClass(MyService.class)
    public class MyConfiguration {
    @Bean
    public MyConditionalBean statistics() {
    return new MyConditionalBean();
    }
    }
    }

参考:Creating Your Own Auto-configuration :: Spring Bootjava - How does spring-boot @ConditionalOnClass work? - Stack Overflow

posted @   Higurashi-kagome  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2023-01-01 2022年年终总结
2022-01-01 Eclipse:.. cannot be resolved to a type
点击右上角即可分享
微信分享提示