【发布时间】:2019-07-22 06:44:59
【问题描述】:
在我的应用程序中,我有两个具有相同名称的类,但当然位于不同的包中。
这两个类都需要在应用程序中注入;不幸的是,我收到以下错误消息:
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'myFeature' for bean class [org.pmesmeur.springboot.training.service.feature2.MyFeature] conflicts with existing, non-compatible bean definition of same name and class [org.pmesmeur.springboot.training.service.feature1.MyFeature]
我的问题可以通过以下示例重现:
@Component
@EnableConfigurationProperties(ServiceProperties.class)
public class MyService implements IService {
private final ServiceProperties serviceProperties;
private final IProvider provider;
private final org.pmesmeur.springboot.training.service.feature1.IMyFeature f1;
private final org.pmesmeur.springboot.training.service.feature2.IMyFeature f2;
@Autowired
public MyService(ServiceProperties serviceProperties,
IProvider provider,
org.pmesmeur.springboot.training.service.feature1.IMyFeature f1,
org.pmesmeur.springboot.training.service.feature2.IMyFeature f2) {
this.serviceProperties = serviceProperties;
this.provider = provider;
this.f1 = f1;
this.f2 = f2;
}
...
package org.pmesmeur.springboot.training.service.feature1;
public interface IMyFeature {
void print();
}
package org.pmesmeur.springboot.training.service.feature1;
import org.springframework.stereotype.Component;
@Component
public class MyFeature implements IMyFeature {
@Override
public void print() {
System.out.print("HelloWorld");
}
}
package org.pmesmeur.springboot.training.service.feature2;
public interface IMyFeature {
void print();
}
package org.pmesmeur.springboot.training.service.feature2;
import org.springframework.stereotype.Component;
@Component
public class MyFeature implements IMyFeature {
@Override
public void print() {
System.out.print("FooBar");
}
}
如果我为我的课程使用不同的名称MyFeature,我的问题就消失了!!!
我习惯使用Guice,这个框架没有这种问题/限制
好像spring依赖注入框架只使用 类名而不是包名+类名,以便 选择它的类。
在“现实生活”中,我在一个更大的项目中遇到了这个问题,我强烈希望不必重命名我的类:有人可以帮助我吗?
最后一点,我宁愿避免使用“技巧”,例如使用
@Qualifier(value = "ABC")注入我的课程时:在我的示例中, 找到正确的实例应该没有歧义MyFeature因为它们没有实现相同的接口
【问题讨论】:
-
当 diff 包中的两个接口具有相同的抽象方法时,为什么不能使用单个接口?
-
您是否在项目中的任何地方使用
@Bean注释? -
您能对我的回答提供一些反馈吗?我想帮助完成这个问题!!
标签: spring spring-boot dependency-injection guice