Pendant longtemps, j'ai cru qu'il y avait une valeur à avoir une "configuration centralisée et déclarative" comme les fichiers xml que nous utilisions tous. Ensuite, j'ai réalisé que la plupart des éléments des fichiers n'étaient pas de configuration - ils n'ont jamais été modifiés n'importe où après le développement. Ensuite, j'ai réalisé que "centralisé" n'a de valeur que dans des systèmes assez petits - ce n'est que dans les petits systèmes que vous pourrez jamais bloquer un fichier de configuration dans son ensemble . Et quelle est vraiment la valeur de la compréhension du câblage dans son ensemble, lorsque les mêmes "câblages" sont pour la plupart dupliqués par des dépendances dans le code? Donc, la seule chose que j'ai gardée, ce sont les métadonnées (annotations), qui sont toujours en quelque sorte déclaratives. Ceux-ci ne changent jamais à l'exécution et ils ne les données de "configuration" que quelqu'un changera à la volée - donc je pense que les conserver dans le code est bien.
J'utilise autant que possible le câblage automatique complet. J'aime cela. Je ne reviendrai pas au printemps à l'ancienne à moins d'être menacé à bout portant. Mes raisons de préférer pleinement @Autowired
ont changé au fil du temps.
À l'heure actuelle, je pense que la raison la plus importante de l'utilisation du câblage automatique est qu'il y a une abstraction de moins dans votre système à suivre. Le "nom du bean" a effectivement disparu. Il s'avère que le nom du bean n'existe qu'en raison de xml. Ainsi, une couche complète d'indirections abstraites (où vous câblez le nom du bean "foo" dans le "bar" du bean) a disparu. Maintenant, je connecte l'interface "Foo" directement dans mon bean, et l'implémentation est choisie par le profil d'exécution. Cela me permet de travailler avec du code lors du traçage des dépendances et des implémentations. Quand je vois une dépendance auto-câblée dans mon code, je peux simplement appuyer sur la touche "aller à l'implémentation" dans mon IDE et la liste des implémentations connues apparaît. Dans la plupart des cas, il n'y a qu'une seule implémentation et je suis directement dans la classe. Pouvez' quelle implémentation est utilisée (je prétends que le contraire est plus proche de la vérité avec le câblage xml - drôle comment votre perspective change!)
Vous pouvez maintenant dire que ce n'est qu'une couche très simple, mais chaque couche d'abstraction que nous ajoutons à nos systèmes augmente la complexité. Je ne pense vraiment pas que le xml ait jamais ajouté de valeur réelle à un système avec lequel j'ai travaillé.
La plupart des systèmes avec lesquels j'ai déjà travaillé n'ont qu'une seule configuration de l'environnement d'exécution de production. Il peut y avoir d'autres configurations pour le test et ainsi de suite.
Je dirais que le câblage automatique complet est le rubis sur rails du printemps: il embrasse la notion qu'il existe un modèle d'utilisation normal et commun que la plupart des cas d'utilisation suivent. Avec la configuration XML, vous autorisez de nombreuses utilisations de configuration cohérentes / incohérentes qui peuvent / peuvent ne pas être prévues. J'ai vu tellement de configuration xml passer par dessus bord avec des incohérences - est-ce qu'elle est refactorisée avec le code? Je ne pensais pas. Ces variations existent-elles pour une raison? Généralement non.
Nous utilisons à peine des qualificatifs dans notre configuration et avons trouvé d'autres moyens de résoudre ces situations. C'est un "désavantage" évident que nous rencontrons: nous avons légèrement changé la façon dont nous codons pour le rendre plus fluide avec le câblage automatique: un référentiel client n'implémente plus l' Repository<Customer>
interface générique mais nous créons une interface CustomerRepository
qui s'étend Repository<Customer>
. Parfois, il y a aussi une ou deux astuces en matière de sous-classement. Mais cela nous pointe généralement vers une frappe plus forte, ce qui est presque toujours une meilleure solution.
Mais oui, vous êtes lié à un style particulier de DI que le printemps fait. Nous ne rendons même plus de paramètres publics pour les dépendances (vous pouvez donc affirmer que nous sommes +1 dans le département d'encapsulation / masquage des informations) Nous avons encore du XML dans notre système, mais le XML ne contient essentiellement que les anomalies. Le câblage automatique complet s'intègre parfaitement avec xml.
La seule chose dont nous avons besoin maintenant est que le @Component
, @Autowired
et le reste soit inclus dans un JSR (comme le JSR-250 ), donc nous n'avons pas à nous lier au ressort. C'est ainsi que les choses se sont passées dans le passé (les choses me viennent java.util.concurrent
à l'esprit), donc je ne serais pas entièrement surpris si cela se reproduisait.