首页 > 解决方案 > Bean 定义被 AutoConfiguration 覆盖

问题描述

在我的 Spring 应用程序中,我定义了一个 bean 类型AuditListener

@Component
public class AuditListener {
}

我的项目还包含一个依赖项,spring-boot-starter-actuator该依赖项还定义了一个AuditListenervia类型的 bean AuditAutoConfiguration

当我尝试启动我的应用程序时,它失败了,因为我自己AuditListener的不可用。

// successful
beanFactory.getBean(org.springframework.boot.actuate.audit.listener.AuditListener.class);

// fails with NoSuchBeanDefinitionException
beanFactory.getBean(demo.AuditListener.class);

例外:

java.lang.IllegalStateException: Failed to execute ApplicationRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:791)
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:778)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
    at demo.DemoApplication.main(DemoApplication.java:14)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'demo.AuditListener' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:347)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334)
    at demo.DemoApplication.run(DemoApplication.java:27)
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:788)
    ... 11 more

DefaultListableBeanFactory 日志

INFO 10140 --- [main] osbfsDefaultListableBeanFactory:用不同的定义覆盖 bean 'auditListener' 的 bean 定义:替换 [Generic bean: class [demo.AuditListener]; 范围=单例;摘要=假;懒惰初始化=假;自动线模式=0;依赖检查=0;自动接线候选=真;主要=假;工厂BeanName=空;工厂方法名=空;初始化方法名=空;销毁方法名=空;在文件 [C:\workspace\spring-autoconfiguration-conflict-demo\target\classes\demo\AuditListener.class]] 中定义,带有 [Root bean: class [null]; 范围=; 摘要=假;懒惰初始化=假;自动线模式=3;依赖检查=0;自动接线候选=真;主要=假;factoryBeanName=org.springframework.boot.actuate.autoconfigure.audit.AuditAutoConfiguration;factoryMethodName=审计监听器;初始化方法名=空;destroyMethodName=(推断);在类路径资源 [org/springframework/boot/actuate/autoconfigure/audit/AuditAutoConfiguration.class] 中定义

如何在AuditListener不重命名自己的情况下将两个 bean 放入我的上下文中?

编辑:如果我在不同的包中定义了两个具有相同类名的 bean,我会得到一个 ConflictingBeanDefinitionException,所以 ApplicationContext 甚至不会启动。

标签: javaspringspring-boot

解决方案


你可以给你的bean一个名字,这样它就不会和SpringBootbean冲突

@Component(value = "myCustomAuditListener ")
public class AuditListener {
}

然后用@Qualifies名字注入它myCustomAuditListener


推荐阅读