Pourquoi ai-je besoin d'un setter pour le champ autowired / injecté?
J'ai un haricot:
<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>
documentLogicstateAccess et contextAccess sont des champs sur BasketLogicImpl
Et je n'ai pas <context:component-scan />
EfcoBasketLogic.java:
public class EfcoBasketLogic extends BasketLogicImpl {
@Inject
private EfcoErpService erpService;
...
...
...
}
erpService est nullà moins de me fournir un setter. Mais pourquoi? J'ai pensé à un setter n'est pas nécessaire, où permettra à l'autowiring a lieu? Se pourrait-il que BasketLogicImpl est responsable de cela?
source d'informationauteur GarfieldKlon | 2012-11-02
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un setter parce que les annotations ne sont pas détectés à moins que le printemps est dit de manière soit à travers
<context:component-scan />
ou<context:annotation-config />
. Setter est détecté parce que vous avez spécifiéautowire="byType"
.Vous pouvez trouver cette question et de la réponse utile: Quand utiliser permettra à l'autowiring au Printemps
Tout d'abord, l'utilisation de
<context:component-scan />
ou<context:annotation-config />
permet de Printemps pour analyser votre code pour bénéficier de haricots pour satisfaire les dépendances, ce qui va grandement améliorer la capacité de les câbler correctement, alors je vous suggère de les ajouter à votre fichier de contexte.Deuxième, vous devez être conscient que @Inject est un standard (le sens de la JSR 330 spécification) annotation. Il est bon de mélanger et assortir Printemps annotations à la norme, mais le comportement peut varier en faisant de la sorte. @Nommé est souvent jumelé avec @Inject pour correspondre à des composants avec des dépendances (deux JSR 330). Voir ce référence pour plus de détails, et reportez-vous au Tableau 4.6 pour l'utilisation des commentaires.
Mais pour répondre directement à votre question, "pourquoi dois-je besoin d'un poseur lorsque vous n'utilisez pas component-scan", est parce que vous n'êtes pas à l'aide de component-scan. Vous vous demandez Printemps à injecter une dépendance "byType", mais qui ne permettent pas de Printemps pour analyser votre code pour les composants qui sont de ce type. La raison pour laquelle le poseur de travaux est que le type de l'incubateur argument étant injecté peut être découvert par le Printemps dans le code compilé (notamment les méta-données), et donc il résout correctement votre demande.
Ma compréhension est que le XML de configuration remplace annotation config.Le fait que autowire="byType" spécifié remplace l'auto injection, qui a l'air d'une présence de la méthode de définition pour l'injection de la dépendance.