即使强制执行bean类型,也会在自动装配时发生冲突的bean

时间:2013-11-09 12:41:39

标签: java spring

我有两个类的bean - 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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

拇指规则绝不依赖于自动生成的名称。默认情况下,bean名称将是去大写的非限定类名。在你的情况下

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

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

class 1 -> myClass
class 2 -> myClass

上述情况不会发生,因为这些值必须是唯一的,因此您获得了ConflictingBeanDefinitionException

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