java - Bean 定义被 AutoConfiguration 覆盖
问题描述
在我的 Spring 应用程序中,我定义了一个 bean 类型AuditListener
。
@Component
public class AuditListener {
}
我的项目还包含一个依赖项,spring-boot-starter-actuator
该依赖项还定义了一个AuditListener
via类型的 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 甚至不会启动。
解决方案
你可以给你的bean一个名字,这样它就不会和SpringBoot
bean冲突
@Component(value = "myCustomAuditListener ")
public class AuditListener {
}
然后用@Qualifies
名字注入它myCustomAuditListener
推荐阅读
- java - 在对象的帮助下打印一个方法(在java中运行时动态创建)
- java - tmp下的spring boot spring.log
- android - aSyncTask 只运行一次
- typescript - 如何突出显示输入的文本?
- awk - 为什么 '-1' 在 awk 中不起作用,但 '(-1)' 起作用?
- windows - 如何更改 Team Foundation Server 2018 中的控制源
- c# - 在 C# 中构建基于时间的异步服务的好方法
- c# - QnAMakerDialog - 使用元数据
- c# - .NET Core 2.x 如何获取当前活动的本地网络 IPv4 地址?
- javascript - react中基于props名称的动态导入