spring-boot @ConditionalOnClass如何工作?

@ConditionalOnClass注释如何工作?

我的目标是仅在jar提供此类的类包含在类路径中时才加载特定的bean 。

我以为我可以一个注释@Bean@ConditionalOnClass(MyService.class)和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-frameworkas依赖关系的人都应该自动连接该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?

从春季文档:

必须存在的类。由于此注释是通过加载类字节码解析的,因此可以在此处指定最终可能不在类路径中的类是安全的。

但是错误状态有所不同…

回答:

接得好!

您可以在@Bean方法级别使用,但在这种情况下,您必须将您的类指定为String文字:

@Bean

@ConditionalOnClass(name ="de.MyService")

public MyConditionalBean statistics() {

return new MyConditionalBean();

}

我还没有记住“为什么”,但是它来自Spring Boot源代码的现有代码。

以上是 spring-boot @ConditionalOnClass如何工作? 的全部内容, 来源链接: utcz.com/qa/425510.html

回到顶部