当前位置: 首页 > 面试题库 >

Spring @Autowired用2个相同类型的bean

林威
2023-03-14
问题内容

我有以下定义。

@Autowired
DaoType1<object1> someDao;

@Autowired
DaoType1<object1> someListDao;

在我的bean定义中,我有两个相同类型的bean

<bean id="someDao" class="com.example.DaoType1" />
<bean id="someListDao" class="com.example.DaoType1" />

如果有所不同,则从另一个xml文件导入第二个bean。它们也设置了不同的属性。为什么spring不会抛出错误,因为已经定义了2个相同类型的bean。它是否使用html" target="_blank">变量名,因为它们与bean
id匹配。dao是不同的,如果我对两个不同的bean使用@Qualifiers,则功能可以按预期工作。

这是一个更简洁的版本。我没有考虑其他豆类,因为它们不相关。

applicationContext.xml

<import resource="classpath:dm-services-crud.xml"/>
<bean id="ruleListCrudService" class="com.idna.dm.service.crud.impl.RuleCrudServiceImpl"> 
    <property name="crudDao" ref="ruleListCrudDao" />
</bean>

dm-services-crud.xml

    <bean id="ruleCrudService" class="com.idna.dm.service.crud.impl.RuleCrudServiceImpl">
        <property name="crudDao" ref="ruleCrudDao" />
        <property name="ruleNetworkOfNodesCrudService" ref="ruleNetworkOfNodesCrudService" />
        <property name="elementMappingsCrudService" ref="elementMappingsCrudService" />
        <property name="ruleCrudDao" ref="newRuleCrudDao"/>
   </bean>

default-autowire根本不在我的任何xml文件中。


问题答案:

这似乎是预期的行为。该文档说:

按名字

按属性名称自动布线。Spring寻找与需要自动装配的属性同名的bean。例如,如果一个bean定义被设置为按名称自动装配,并且包含一个master属性(即,它具有setMaster(..)方法),Spring将查找一个名为master的bean定义,并使用它来设置属性。

我想这意味着您已经default-autowire="byName"在applicationContext.xml中指定了。

但是,重构可能会以不可预测的方式影响此操作。这就是为什么(我认为)建议根据类型切换到自动装配,并通过使用来消除Bean歧义的原因。

  • @Qualifier (如您所述)
  • @Resource而不是@Autowired(如skaffman所述)


 类似资料:
  • Spring配置:我创建了2个bean,引用了相同的类但不同的数据库会话。 现在有没有办法将id为“abc1”的bean设置为用于自动装配的默认bean,并在像这样明确提到时使用abc2进行自动装配: 解决方案: 使abc1默认为自动连接。 为了创建abc2的实例,我们可以使用:

  • 问题内容: 我喜欢基于构造函数的注入,因为它允许我进行注入的字段。我还喜欢注释驱动的注入,因为它简化了我的操作。只要没有两个相同类型的参数,就可以用标记构造函数,并且一切正常。例如,我有一个课: 以及具有以下内容的应用程序上下文: 应该有一种在类的构造函数上指定bean ID的方法,但是我在文档中找不到它。是否有可能,或者我是否梦想着不存在的解决方案? 问题答案: 是按类型(在这种情况下);用于按

  • 问题内容: 在JPA中,我有2个实体:Entry和Comment。条目包含两个Comment对象集合。 为了存储这些对象,JPA + Hibernate创建“ Entry”表,“ Comment”表和单个“ Entry_Comment”: 对象的存储失败,并且不能同时为“非null”。 如何使用JPA + Hibernate存储包含两个相同类型的集合的对象? 问题答案: 这是许多Hibernate

  • 我使用一个Android库,它要求我创建两个类,每个类继承自不同的类 (具有公共基类) 现在我有这个代码: 我必须复制这个类来创建一个扩展,即使我的两个类共享完全相同的代码。 我简化了示例的代码,但重复可能很重要 我决定将代码放在这两个类之外的静态方法中,并在类重写的方法中调用它们,但我认为必须有一种更干净的方法来做到这一点。 你能帮我解决这个问题吗? 和都继承自。

  • 问题内容: 在JPA中,我有2个实体:Entry和Comment。条目包含两个Comment对象集合。 为了存储此类对象,JPA + Hibernate创建“ Entry”表,“ Comment”表和单个“ Entry_Comment”: 对象的存储失败,并且不能同时为“非null”。 如何使用JPA + Hibernate存储包含两个相同类型的集合的对象? 问题答案: 这是许多Hibernate

  • 假设我有以下几点 我无法指定要在每个子类中使用的服务实现。我已经考虑过使用@Qualifier,但是我必须在每个子类中重新声明属性并在那里使用它,并且希望它覆盖父类。 这些类的目的是同时提供API的两个版本。因此,这两个版本将同时处于活动状态。 从Spring是如何注入豆子的角度来看,这确实是一种反模式,所以我对其他方法持开放态度。