Bonjour,
Je me pose la question du bien-fondé de l'annotation @Autowired.
Considérons la situation suivante :
- une interface Toto
- une classe TotoImpl implémentant l'interface Toto
- une classe X déclarant un attribut attr de type Toto
Avant Spring, on mettait quelque part dans le code de X la ligne de code suivante :
attr = new TotoImpl()
Les plus malins créaient une factory de Toto permettant de découpler X de TotoImpl. Néanmoins, l'appel au constructeur de TotoImpl devait quand même apparaitre dans le code (de la factory).
Avec Spring, le découplage est total :
- on écrit dans un fichier de configuration xml :
<bean id="toto" class="TotoImpl"/>
<bean id="x" class="X"/> <property name="attr" ref="toto"/> </bean>
- et il n'y a plus aucun appel au constructeur de TotoImpl dans le code java.
Maintenant, si je crée une classe TotoImplBis qui implémente aussi Toto. J'ai juste à changer de fichier xml pour faire en sorte que attr pointe vers une instance de ma nouvelle classe.
Là, je vois bien l'intérêt de la chose : le code de Toto et de X est parfaitement réutilisable (même si je n'ai pas les sources).
Avec Spring 2.5, on me propose d'utiliser des annotations.
- J'annote donc les classes TotoImpl et X avec @Component
- J'annote attr avec @Autowired
J'ai cru comprendre que l'intérêt de telles annotations était d'alléger les fichiers xml. Je comprends bien que je n'ai plus besoin de définir mes beans explicitement et que Spring va faire tout le travail pour moi (j'ai juste à fournir une petite formule magique dans le fichier xml).
Mais, si je reprends mon idée de créer une classe TotoImplBis (évidemment annotée avec @Component), Spring me signale, à juste titre, qu'il ne sait pas quel bean associer à attr.
1/ J'ai donc perdu la réutilisabilité du code que Spring m'avait fait gagner dans un premier temps.
2/ Si de telles annotations ne sont utiles que lorsqu'il n'y a qu'une seule implémentation pour une interface donnée, à quoi bon découpler les choses. Autant revenir à la situation initiale et remettre un new TotoImpl() dans le code de X.
J'espère que mes explications ne sont pas trop embrouillées, et si quelqu'un veut bien éclairer ma lanterne en me disant ce que l'on gagne vraiment avec ces annotations, je lui en serait reconnaissant.
Partager