10

我有一个豆子:

    <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>

documentLogicstateAccesscontextAccessBasketLogicImpl上的字段

而我没有<context:component-scan />

EfcoBasketLogic.java:

public class EfcoBasketLogic extends BasketLogicImpl {

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

erpService 是null,除非我提供了一个设置器。但为什么?我认为在进行自动装配的地方不需要二传手?会不会是 BasketLogicImpl 对此负责?

4

3 回答 3

11

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

您可能会发现这个问题和答案也很有帮助:When to use autowiring in Spring

于 2012-11-02T10:49:38.910 回答
1

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

其次,您应该知道@Inject 是一个标准(即JSR-330 规范)注解。可以将 Spring 注释与标准注释混合和匹配,但这样做时行为可能会有所不同。@Named 通常与 @Inject 配对以匹配具有依赖项的组件(均为 JSR-330)。有关详细信息,请参阅此参考资料,有关使用说明,请参阅表 4.6。

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

于 2013-09-03T19:01:36.010 回答
0

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

于 2016-04-13T19:13:40.453 回答