Java spring boot@ConditionalOnClass是如何工作的?

Java spring boot@ConditionalOnClass是如何工作的?,java,spring,spring-boot,Java,Spring,Spring Boot,@ConditionalOnClass注释是如何工作的 我的目标是仅当类路径中包含提供该类的jar时加载特定bean 我认为我可以用@ConditionalOnClass(MyService.class)注释@Bean,并在maven中将依赖项声明为可选: <dependency> <groupId>de.my</groupId> <artifactId>my-framework<artifactId> <

@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();
}
所以我可能做错了什么。然后,如何根据依赖项jar和类路径中包含的类创建bean条件

从spring文档中:

必须出现的类。由于此批注已由解析 加载类字节码在这里指定可能 最终不在类路径上

但是错误状态不同…

捕捉得好

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

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

我已经记不起“为什么”,但它来自于Spring Boot源代码的现有代码。

如果将它放在顶级类中,我会在类加载时将其拉入。这是在使用类的时候。将其用作字符串文字可以防止这种情况。注意,如果它是在类级别声明的,则不必是字符串文字。算了吧。
@Bean
@ConditionalOnClass(name ="de.MyService")
public MyConditionalBean statistics() {
    return new MyConditionalBean();
}