gpt4 book ai didi

java - spring-boot @ConditionalOnClass 是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 13:51:34 25 4
gpt4 key购买 nike

@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?

来自 Spring 文档:

The classes that must be present. Since this annotation parsed by loading class bytecode it is safe to specify classes here that may ultimately not be on the classpath.

但错误状态不同...

最佳答案

好收获!

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

@Bean
@ConditionalOnClass(name ="de.MyService")
public MyConditionalBean statistics() {
return new MyConditionalBean();
}

我不记得“为什么”了,但它来自 Spring Boot 源代码的现有代码。

关于java - spring-boot @ConditionalOnClass 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com