当前位置: 首页 > 面试题库 >

spring-boot @ConditionalOnClass如何工作?

东方和煦
2023-03-14
问题内容

@ConditionalOnClass注释如何工作?

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

我以为我可以一个注释@Bean@ConditionalOnClass(MyService.class)和Maven作为可选声明依赖性:

<dependency>
    <groupId>de.my</groupId>
    <artifactId>my-framework<artifactId>
    <html" target="_blank">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缓存中的值,但是@cacheput并没有替换实际值,而是使用相同的键放入另一个值: CacheName:NotimeCache: 键:SYSTEM_STATUS,值:on 键:SYSTEM_STATUS,值:off

  • 有一个第三方jar包含旧版本的javax.validation库 还有随hibernate-validator(5.3.5.final)一起提供的Spring Boot默认javax.validation库(1.1.0.final) 我的代码构建正常。但在启动过程中会失败,并出现以下错误: 从日志中可以清楚地看出,找不到方法,这是由于验证API版本之间的冲突。我知道Hibernate-valida

  • 在我的项目中,当我试图通过重写AuthenticationManagerBean()方法为AuthenticationManager定义bean时,它显示了以下错误, SecurityConfiguration类型的authenticationManagerBean()方法必须重写或实现超类型方法 下面给出了我定义的方法, 我的整个安全配置类如下所示, 在之前使用Spring Boot 2.1.9

  • 我的Application.Properties中有属性,但它不起作用。应用程序stil使用我的中定义的级别

  • 我正在尝试为我的spring boot应用程序添加单元测试。它不工作,抛出404。我使用的是1.2.1版本的spring boot,并且对spring boot starter测试有依赖关系。如果我遗漏了什么,请告诉我。spring boot应用程序可以正常工作。 这是我的代码, 我的jUnit测试用例代码, 控制台有 而JUnit的结果有