我有一个豆子:
<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对此负责吗?
答案 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方法。