217 votes

Printemps @Autocâblés utilisation

Quels sont les avantages et les inconvénients de l'utilisation de @Autocâblés dans une classe qui sera câblé en place d'ici le Printemps?

Juste pour préciser, je parle précisément de la @Autocâblés annotation, pas d'auto-câblage en XML.

J'ai probablement juste de ne pas comprendre, mais pour moi, il semble presque comme un anti-pattern - vos cours commencent à prendre conscience qu'ils sont liés à une DI-cadre, plutôt que d'être simplement Pojo. Peut-être que je suis maso, mais j'aime avoir l'externe de configuration XML pour les haricots, et j'aime bien avoir explicite les câbles de connexion, donc je sais exactement ce qui est câblé où.

252voto

krosenvold Points 35979

Pendant longtemps, j'ai cru qu'il y avait une valeur dans le fait d'avoir un "centralisé, déclarative, la configuration" comme les fichiers xml, nous avons tous l'habitude d'utiliser. Puis j'ai réalisé que la plupart des choses dans les fichiers n'était pas de configuration n'a jamais été changé partout après le développement, jamais. Puis j'ai réalisé que "centralisé" n'a de valeur que dans les très petits systèmes - seulement dans les petits systèmes allez-vous être en mesure d'analyser un fichier de configuration dans son ensemble. Et ce qui est vraiment la valeur de la compréhension du câblage de l'ensemble, quand même "câblages" sont pour la plupart reproduits par les dépendances dans le code? Donc, la seule chose que j'ai gardé est de méta-données (annotations), qui est encore de type de déclaratif. Ces jamais changer lors de l'exécution et ils sont jamais "configuration" données que quelqu'un va changer à la volée, donc je pense le garder dans le code est agréable.

J'utilise plein d'auto-câblage autant que je le peux. Je l'aime. Je ne vais pas revenir à l'ancienne printemps, à moins menacé à l'arme de point. Mes raisons pour préférer entièrement @Autocâblés ont changé au fil du temps.

Maintenant, je pense que la raison la plus importante pour l'aide permettra à l'autowiring est qu'il y a un moins d'abstraction dans votre système pour garder une trace de. Le "haricot nom" est effectivement disparu. Il s'avère que la fève de nom n'existe que parce que de xml. Ainsi, une couche complète de l'abstrait indirections (où vous fil bean-name "foo" en haricot "bar") a disparu. Maintenant, je fil "Foo" de l'interface dans mon haricot directement, et la mise en œuvre est choisi par le moment de l'exécution du profil. Cela me permet de travailler avec le code lors du traçage des dépendances et des implémentations. Quand je vois un autocâblés dépendance dans mon code je peux juste appuyer sur "aller à la mise en œuvre" dans mon IDE et vient jusqu'à la liste des implémentations. Dans la plupart des cas, il y a juste une mise en œuvre et de je suis de droite dans la classe. Ne peut pas être beaucoup plus simple que cela, et je sais toujours exactement ce que la mise en œuvre est en cours d'utilisation (je demande que l'inverse est plus proche de la vérité avec xml câblage - drôle de voir comment votre point de vue change!)

Maintenant, vous pourriez dire que c'est juste une très simple couche, mais chaque couche d'abstraction que nous ajoutons à nos systèmes d' augmentation de la complexité. Je ne pense vraiment pas que le xml jamais ajouté une valeur à tout système qui j'ai travaillé.

La plupart des systèmes que j'ai jamais travailler avec seulement une configuration de la production de l'environnement d'exécution. Il y a peut être d'autres configurations de test et ainsi de suite.

Je dirais que complet permettra à l'autowiring est le ruby-on-rails de printemps: Il embrasse la notion qu'il y a une normale et courante du schéma d'utilisation que la plupart des cas d'utilisation à suivre. Avec XML de configuration vous permettent beaucoup de cohérent/incohérent de configuration de l'utilisation qui peut/ne peut pas être prévu. J'ai vu tellement de configuration xml aller à la mer avec des incohérences - t-il faire remaniée avec le code ? Ne pensais pas. Sont ces variations sont là pour une raison? Généralement pas.

Nous avons à peine utiliser des qualificatifs dans notre configuration, et trouvé d'autres moyens pour résoudre ces situations. C'est clairement un "inconvénient" que nous rencontrons: Nous avons légèrement changé la façon dont nous le code pour le faire interagir plus lisse avec permettra à l'autowiring: Un référentiel client implémente plus le générique Référentiel<Client> interface, mais nous faisons une interface CustomerRepository qui s'étend Référentiel<Client>. Parfois, il y a aussi un truc ou deux quand il s'agit de sous-classement. Mais il y a généralement que des points dans le sens d'un renforcement de typage, qui je trouve est presque toujours une meilleure solution.

Mais oui, vous êtes à l'aide d'un style particulier de DI que la plupart de printemps. Nous n'avons même pas rendre public les setters pour les dépendances de plus (Donc on pourrait dire que nous sommes +1 dans l'encapsulation/se cacher de l'information service), Nous avons encore un peu de xml dans notre système, mais le xml fondamentalement seulement contient les anomalies. Complet permettra à l'autowiring s'intègre bien avec xml.

La seule chose dont nous avons besoin maintenant, c'est de la @Composant, @Autocâblés et le reste pour être inclus dans une JSR (comme JSR-250), donc nous n'avons pas de lien avec le printemps. C'est la façon dont les choses ont été faits dans le passé (la java.util.simultanées truc me vient à l'esprit), donc je ne serais pas surpris si c'est arrivé de nouveau.

26voto

Jared Knipp Points 1855

Pour moi ici, c'est ce que j'aime/n'aime pas le Printemps et permettra à l'autowiring.

Pour:

  • Permettra à l'autowiring de se débarrasser des méchants de configuration XML
  • Beaucoup plus facile d'utiliser des annotations qui vous permet d'injecter directement à l'aide des champs, des méthodes de définition, ou des constructeurs. Vous permet également d'annoter et de qualifier votre injecté des haricots.

Inconvénients:

  • L'aide permettra à l'autowiring et annotations vous rend dépendant de Printemps des bibliothèques où, comme avec configuration XML, vous pouvez choisi de courir avec ou sans Ressort. Comme vous l'avez dit, vous devenez attaché à un DI-cadre.
  • Dans le même temps, j'aime être en mesure de qualifier les haricots, pour moi, cela rend le code vraiment salissant. Si vous avez besoin d'injecter de la même haricot dans de multiples endroits, j'ai vu le même nom de chaîne répété partout. Pour moi, cela semble avoir le potentiel pour des erreurs.

J'ai commencé à utiliser permettra à l'autowiring presque exclusivement au travail parce que nous comptons donc beaucoup sur le Printemps de l'intégration de toute façon que la dépendance à la question est discutable. J'ai travaillé sur un Spring MVC projet utilisé permettra à l'autowiring largement et a été un peu difficile pour envelopper ma tête autour de.

Je pense permettra à l'autowiring est un goût acquis, une fois que vous vous habituez à elle vous vous rendez compte combien puissant, facile, et beaucoup moins de mal de tête, c'est de travailler avec de la configuration XML.

15voto

Masterhard Points 111

Nous sommes de commutation de @Autowire retour à la configuration XML dans notre grand projet. Le problème est très faible bootstrap de la performance. Permettra à l'autowiring de scanner les charges de toutes les classes de permettra à l'autowiring de recherche classpath, donc, beaucoup de classes sont chargés avec empressement au cours du Printemps de l'initialisation.

6voto

BTakacs Points 198

Il y a eu très peu de discussions sur le changement d'environnement. La plupart des projets sur lesquels j'ai travaillé, il a été un vrai problème pour injecter des dépendances en fonction de l'environnement de notre travail. Avec xml de config c'est assez simple avec le Printemps EL, et je ne suis pas au courant de toute solution sympa avec des annotations. J'ai trouvé:

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

Il convient de travail, mais pas une belle solution à mon humble avis.

4voto

Paul McKenzie Points 4841

Je suis passé à @Autowire. Le maintien de la configuration XML sur quoi que ce soit d'autre qu'un petit projet est devenu une tâche dans son propre droit et de la compréhension dégradé rapidement.

IntelliJ qui fournit de bonnes (pas parfait) soutien pour le Printemps des annotations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X