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
所指明的类。
有两种解决方法:
-
指定全类名
@Bean @ConditionalOnClass(name ="com.example.MyService") public MyConditionalBean statistics() { return new MyConditionalBean(); } -
内嵌配置类
@AutoConfiguration public class MyAutoConfiguration { @Configuration @ConditionalOnClass(MyService.class) public class MyConfiguration { @Bean public MyConditionalBean statistics() { return new MyConditionalBean(); } } }
参考:Creating Your Own Auto-configuration :: Spring Boot、java - How does spring-boot @ConditionalOnClass work? - Stack Overflow
分类:
计算机
标签:
Java
, SpringBoot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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