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

标签 java spring spring-boot

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

相关文章:

eclipse - 运行 Tomcat + Spring + Maven 项目时出现 NoClassDefFoundError (Eclipse)

java - Spring Boot JPA 配置中没有名为 'transactionManager' 的可用 bean

spring-boot - Spring WebFlux WebClient 挂起并且 Mono.timeout 没有捕捉到它

java - Spring 启动和 ddl-auto 问题

java - Spring boot注入(inject)mongodb数据源

java - 反射调用方法还是使用继承的固定方法?

java - 如何摆脱警告 : Use '$' instead of '.' for inner classes in Eclipse

java - 对象的空实例

java - 使用 jdbcTemplate 和 DAO 层在 jUnit 中测试删除方法

java - Spring 4 和 Java 8 无效字节标记异常