1

我有两个类的豆子 -com.abc.MyClasscom.xyz.MyClass

而且我在不同的课程中使用它们 -

@Component
public class Class1{
  @Autowired
  private com.abc.MyClass myClass;
  ...
}

@Component
public class Class2{
  @Autowired
  private com.xyz.MyClass myClass;
  ...
}

它给出了 ConflictingBeanDefinitionException,因为 bean 名称与预期的“myClass”相同。我的疑问是,我能做些什么来解决这个问题以按类型注入 bean。我尝试使用Resource并强制执行该类型 -

@Resource(type=com.xyz.MyClass)
private com.xyz.MyClass myClass; 

但这也不起作用。还是给ConflictingBeanDefinitionException

4

2 回答 2

0

经验法则是永远不要依赖自动生成的名称。默认情况下,bean 名称将是非大写的非限定类名称。在你的情况下

class 1 -> com.abc.MyClass
class 2 -> com.xyz.MyClass

非限定类名是相同的(MyClass),所以在春季上下文中会有

class 1 -> myClass
class 2 -> myClass

以上不会发生,因为这些值必须是唯一的,因此你得到ConflictingBeanDefinitionException

正如所指出的,@Component("name")是您的问题的解决方案。如果您想检查自动生成的名称,您的 bean 可能会实现BeanNameAware接口,该接口是容器回调,它将 bean 名称传递给您的 bean。

于 2013-11-10T12:00:01.403 回答
0

您可以使用 @Qualifier("beanName") 注释通过指定要映射的确切 bean 名称来解决冲突

于 2013-11-09T13:41:50.563 回答