自动装配实现相同接口的两个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>
启动服务器时,这(当然)会导致异常:
嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义[com.sevenp.mobile.samplemgmt.service.dao.DeviceDao]类型的唯一bean:期望的单个匹配bean,但发现2:[deviceDao,jdbcDeviceDao]
从试图像这样自动装配bean的类中
@Autowiredprivate DeviceDao hibernateDevicDao;
因为有两个bean实现相同的接口。
回答:
我不必对现有的类进行更改,因为这些类已经HibernateDeviceDao
自动接线
仍然可以像这样使用第二个(新)bean:
@Autowired@Qualifier("jdbcDeviceDao")
也就是说,我需要一种将HibernateDeviceDao
bean
配置为自动装配的默认bean的方法,同时允许在JdbcDeviceDao
带有@Qualifier
注释的显式指定时使用the 。
回答:
我尝试设置属性
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。
*
我将其解释为意味着我仍然可以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
,即(假设你使用@Repository
的HibernateDeviceDao
):
@Primary@Repository
public class HibernateDeviceDao implements DeviceDao
这样,它将被选作默认的自动装配候选,而无需autowire-candidate
在另一个bean上。
另外,与使用相比@Autowired @Qualifier
,我发现使用它@Resource
来挑选特定的豆更优雅,例如
@Resource(name="jdbcDeviceDao")DeviceDao deviceDao;
以上是 自动装配实现相同接口的两个bean-如何将默认bean设置为自动装配? 的全部内容, 来源链接: utcz.com/qa/424503.html