【发布时间】:2023-03-30 18:16:01
【问题描述】:
@ConditionalOnClass 注释究竟是如何工作的?
我的目标是仅当提供此类的jar 包含在类路径中时才加载特定的bean。
我认为我可以用 @ConditionalOnClass(MyService.class) 注释 @Bean 并将 maven 中的依赖项声明为可选:
<dependency>
<groupId>de.my</groupId>
<artifactId>my-framework<artifactId>
<optional>true</optional>
</dependency>
@Bean
@ConditionalOnClass(MyService.class)
public MyConditionalBean statistics() {
return new MyConditionalBean();
}
现在,任何将 my-framework 作为依赖项的人都应该自动连接该 bean。但是任何没有依赖关系的人都应该跳过它。
但是当我启动应用程序时,我收到以下错误:
Caused by: java.lang.ClassNotFoundException: de.MyService.class
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702) ~[catalina.jar:7.0.50]
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547) ~[catalina.jar:7.0.50]
所以我可能做错了什么。然后如何根据依赖项 jar 和类路径中包含的类创建 bean?
来自春季文档:
必须存在的类。由于此注释由 加载类字节码 在这里指定类是安全的 最终不在类路径上。
但错误状态不同...
【问题讨论】:
标签: java spring spring-boot