Spring按类型注入:两个名称相同的@Repository

4

我有这样一对dao:

package com.company.project.model.requests.type;

@Repository("requestTypeDao")
public class RequestTypeDaoHibernate extends AbstractReadDao implements RequestTypeDao {

}

package com.company.project.model.support.type;

@Repository("requestTypeDao")
public class RequestTypeDaoHibernate extends AbstractReadDao implements RequestTypeDao {

}

我正在尝试将它们注入到一些XXXServiceImpl类中(从未同时注入到同一类中),方法如下:

@Autowired
private RequestTypeDao requestTypeDao;

因为它们不是同一类型,所以我期望Spring根据正确包中导入的类型进行注入(从未从同一包中导入两个RequestTypeDao),但它显示了一个错误:
Annotation-specified bean name 'requestTypeDao' for bean class [com.company.project.model.support.type.RequestTypeDaoHibernate] conflicts with existing, non-compatible bean definition of same name and class [com.company.project.model.requests.type.RequestTypeDaoHibernate]

在错误信息中,您可以看到类不相同。我已经阅读了关于@Qualifier注释的内容,但我理解这意味着必须修改@ Repository注释中写入的名称。我还认为@Resource或@Inject不是我要找的。

我们不介意最终更改名称,但我们想知道是否可以通过Spring进行实际的按类型注入。这是两个具有相同名称和不同类类型以及包的存储库,被注入到不同的类中(从未是同一个类)。

1个回答

4

实际上这是不可能的。没有办法在Spring中注册两个同名的bean。否则在运行时,Spring无法处理你想要哪个bean,因此必须使用@Qualifier

您可以在此处了解更多信息。

@Autowired
@Qualifier("personA")
private Person person;



@Autowired
@Qualifier("personB")
private com.blabla.myOtherPackage.Person person;

你有没有意识到我从来没有把这两个声明放在同一个类中?这并不会改变什么吗? - madtyn
1
确实,这并没有改变什么。Spring使用bean定义将类注册到其依赖管理系统中。在那里,名称必须是唯一的。请查看我在答案中写的链接。 - Sercan Ozdemir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接