背景:
我有一个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")
也就是说,我需要一种方法来将HibernateDeviceDao
Bean 配置为自动装配的默认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
,即(假设你使用@Repository
的HibernateDeviceDao
):
@Primary
@Repository
public class HibernateDeviceDao implements DeviceDao
这样,它将被选作默认的自动装配候选,而无需autowire-candidate
在另一个bean上。
另外,与使用相比@Autowired @Qualifier
,我发现使用它@Resource
来挑选特定的豆更优雅,例如
@Resource(name="jdbcDeviceDao")
DeviceDao deviceDao;
我有一个spring 2.5/Java/Tomcat应用程序。下面有一个bean,在整个应用程序的许多地方都使用了这个bean 和以下新bean: 第一个bean是这样配置的(包中的所有bean都包含在内) 第二个(新的)bean是单独配置的 这会导致(当然)启动服务器时出现异常: 嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitio
有没有可能让一个Spring Bean实现两个接口,并能够使用任何一个接口自动连接Bean? 一个实现两个服务的类 我正在获取: 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到依赖项[ServiceB]的[ServiceB]类型的合格bean:需要至少有一个bean可以作为此依赖项的自动候选项。依赖项批注
我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?
我有两个类CustomerDAOImpl和UserDAOImpl,都用@Repository注释进行了注释。我在每个类中定义了@bean并自动连接。 与此完全相同,我在UserDAOImpl类方法中定义、自动连接和使用了以下bean(这里只显示bean定义和自动连接代码,以保持简洁): 现在这两个DAO bean都在我的服务类OrderServiceImpl(用@service注释)中自动连接;下
我在如下配置类中创建了一个bean: 在FoodConfig.java 在食品服务课程中,我需要访问食品配置。所以我自动连接了食品配置。 试图从我的FoodServiceTest类访问AbstractFoodService类中的someParam时,我得到一个Nullpointer异常。 然而,若我在AbstractFoodServiceClass的构造函数中注入FoodConfig,它就会工作。
我正在使用Swing和Spring创建一个金融应用程序。在应用程序的一部分中,我有一个,其中包含应用程序中每个的。单击时,我希望在中显示类型的。这都是在下面的控制器中执行的。 会为每个点击更改,因此我将设置为一个原型bean,因此我将为每个帐户接收一个新实例。为了使原型作用域工作,我需要使用。以下是代码: 您将注意到我试图自动连接类型的bean。但是,该bean没有正确地自动连接,它是空的。以下是