自动连接实现相同接口的两个bean-如何将默认bean设置为自动连接?

背景:

我有一个Spring 2.5 / Java / Tomcat应用程序。下面的bean在整个应用程序中的许多地方都使用过

public class HibernateDeviceDao implements DeviceDao

以下是新的bean:

public class JdbcDeviceDao implements DeviceDao

第一个bean的配置如下(包含了软件包中的所有bean)

<context:component-scan base-package="com.initech.service.dao.hibernate" />

第二个(新)bean是单独配置的

<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao">

<property name="dataSource" ref="jdbcDataSource">

</bean>

启动服务器时,这(当然)会导致异常:

nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.sevenp.mobile.samplemgmt.service.dao.DeviceDao] is defined: expected single matching bean but found 2: [deviceDao, jdbcDeviceDao]

从试图像这样自动装配bean的类中

@Autowired

private DeviceDao hibernateDevicDao;

因为有两个bean实现相同的接口。

问题:

是否可以配置Bean,以便

1.我不必对现有的类进行更改,因为这些类已经HibernateDeviceDao自动接线

2.仍然可以像这样使用第二个(新)bean:

@Autowired

@Qualifier("jdbcDeviceDao")

也就是说,我需要一种方法来将HibernateDeviceDaoBean 配置为自动装配的默认Bean,同时允许在JdbcDeviceDao带有@Qualifier注释的显式指定时使用。

我已经尝试过的:

我尝试设置属性

autowire-candidate="false"

在JdbcDeviceDao的Bean配置中:

<bean id="jdbcDeviceDao" class="com.initech.service.dao.jdbc.JdbcDeviceDao" autowire-candidate="false">

<property name="dataSource" ref="jdbcDataSource"/>

</bean>

因为Spring文档说

指示在寻找匹配的候选对象以满足另一个Bean的自动装配要求时是否应考虑此Bean。请注意,这不会影响按名称的显式引用,即使指定的bean未标记为自动装配候选者,该名称也将得到解析。*

我将其解释为意味着我仍然可以JdbcDeviceDao使用@Qualifier注释自动装配并具有HibernateDeviceDao默认的bean。但是,显然我的解释不正确,因为这会在启动服务器时导致以下错误消息:

类型[类com.sevenp.mobile.samplemgmt.service.dao.jdbc.JdbcDeviceDao]的不满意依赖性:预期至少有1个匹配的bean

来自我尝试使用限定符自动装配Bean的类:

@Autowired

@Qualifier("jdbcDeviceDao")

解:

skaffman 建议尝试使用@Resource注释有效。因此,该配置将jdbcDeviceDao的autowire-candidate设置为false,当使用jdbcDeviceDao时,我使用@Resource注释(而不是@Qualifier)来引用它:

@Resource(name = "jdbcDeviceDao")

private JdbcDeviceListItemDao jdbcDeviceDao;

回答:

我建议带标记Hibernate的DAO类@Primary,即(假设你使用@RepositoryHibernateDeviceDao):

@Primary

@Repository

public class HibernateDeviceDao implements DeviceDao

这样,它将被选作默认的自动装配候选,而无需autowire-candidate在另一个bean上。

另外,与使用相比@Autowired @Qualifier,我发现使用它@Resource来挑选特定的豆更优雅,例如

@Resource(name="jdbcDeviceDao")

DeviceDao deviceDao;

以上是 自动连接实现相同接口的两个bean-如何将默认bean设置为自动连接? 的全部内容, 来源链接: utcz.com/qa/423620.html

回到顶部