我有两个类的豆子 - com.abc.MyClass
和com.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",这是意料之中的。我的疑问是,我该怎么做才能解决这个问题以按类型注入豆子。我尝试使用 Resource
并强制执行该类型 -
@Resource(type=com.xyz.MyClass)
private com.xyz.MyClass myClass;
但这也没有奏效。仍然给ConflictingBeanDefinitionException
您可以使用@Qualifier("beanName")注释通过指定要映射的确切Bean名称来解决冲突
经验法则是永远不要依赖自动生成的名称。默认情况下,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 的容器回调。