自动连线时冲突的 bean,即使强制执行 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",这是意料之中的。我的疑问是,我该怎么做才能解决这个问题以按类型注入豆子。我尝试使用 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 的容器回调。

最新更新