为什么我需要一个用于自动装配/注入字段的setter?

时间:2012-11-02 10:42:57

标签: spring setter autowired inject

我有一个豆子:

    <bean id="BasketLogic" class="efco.logic.EfcoBasketLogic" autowire="byType">
        <property name="documentLogic" ref="DocumentLogic" />
        <property name="stateAccess" ref="StateAccess" />
        <property name="contextAccess" ref="ContextAccess" />
    </bean>

  <bean id="EfcoErpService" autowire="byType" class="efco.erp.service.EfcoErpServiceImpl">
    <constructor-arg ref="ErpConnector"/>
  </bean>

documentLogic stateAccess contextAccess BasketLogicImpl

上的字段

我没有<context:component-scan />

EfcoBasketLogic.java:

public class EfcoBasketLogic extends BasketLogicImpl {

        @Inject
        private EfcoErpService erpService;
    ...
    ...
    ...
}

erpService null ,除非我提供了一个setter。但为什么?我认为在自动装配发生的地方不需要安装器?可能是BasketLogicImpl对此负责吗?

3 个答案:

答案 0 :(得分:11)

您需要使用setter,因为除非通过<context:component-scan /><context:annotation-config />通知spring,否则不会检测到注释。检测到Setter是因为您指定了autowire="byType"

您可能会发现此问题和答案也很有用:When to use autowiring in Spring

答案 1 :(得分:1)

首先,使用<context:component-scan /><context:annotation-config />使Spring可以扫描您的代码以查找符合条件的bean以满足依赖关系,这将极大地提高它正确连接它们的能力,因此我建议添加它们到你的上下文文件。

其次,您应该知道@Inject是一个标准(意思是JSR-330规范)注释。将Spring注释与标准注释混合和匹配是可以的,但这样做时行为可能会有所不同。 @Named通常与@Inject配对,以匹配具有依赖关系的组件(两者都是JSR-330)。有关详细信息,请参阅此reference,有关用法注释,请参阅表4.6。

但是要直接回答你的问题,“为什么我不需要使用组件扫描时需要一个setter”,因为你没有使用组件扫描。您要求Spring注入依赖项“byType”,但不允许Spring扫描您的代码以查找该类型的组件。 setter工作的原因是Spring可以在编译的字节码(即元数据)中发现注入的setter参数的类型,因此它成功地解析了你的请求。

答案 2 :(得分:0)

我的理解是XML配置会覆盖注释配置。指定autowire =“byType”的事实会覆盖自动注入,它会查找是否存在用于注入依赖项的setter方法。