Pourquoi utiliser des CDI dans Java EE
Je sais qu'il y a beaucoup d'articles qui expliquent comment utiliser le CDI en Java EE, mais je vais avoir de la difficulté à décider quel avantage cela apporte réellement. Par exemple, supposons que j'ai une classe qui utilise une instance de Foo. Je risque de ne
Foo myFoo = new Foo();
ou
//Better, FooFactory might return a mock object for testing
Foo myFoo = FooFactory.getFoo();
Je lis qu'avec le CDI je peux le faire:
@Inject
Foo myFoo;
mais pourquoi est-ce mieux que le précédent usine approche? Je suppose que il y a un autre cas d'utilisation que je ne suis pas au courant, mais je n'ai pas été en mesure d'identifier cette.
Si j'ai bien compris les réponses ci-dessous, le concept est que le DI-cadre comporte comme un maître de la fabrique d'objet qui est configuré de manière centralisée. Est-ce une interprétation raisonnable?
Mise à jour
Depuis, j'ai commencé à apprendre le Printemps et maintenant cela fait beaucoup plus de sens. Le paragraphe ci-dessous est extrait de Printemps dans la Pratique prendre un exemple d'un AccountService
classe qui, à son tour, utilise une instance de AccountDao
. Je prie de m'excuser pour la longue citation, mais je pense qu'il est vraiment au cœur de pourquoi injecté des ressources, offrir quelque chose de plus standard à l'initialisation.
Vous pourriez avoir construit le AccountService à l'aide du mot clé new, mais la création d'un service objets de la couche est rarement aussi simples. Ils dépendent souvent de DAOs, mail de l'expéditeur, du SAVON procurations, et autres joyeusetés. Vous pourriez instancier chacune de ces dépendances par programmation dans le AccountService constructeur (ou par l'intermédiaire d'initialisation statique), mais qui entraîne dur dépendances et cascade de changements comme ils sont permutées.
En outre, vous pouvez créer des dépendances de l'extérieur et de les fixer sur le AccountService via des méthodes de définition ou des arguments du constructeur. Cela permettrait d'éliminer le dur interne dépendances (tant qu'elles ont été déclarées dans le AccountService par l'interface), mais vous auriez dupliqué code d'initialisation de partout. Voici comment créer un DAO et fils
jusqu'à votre AccountService le Printemps façon:
<bean id="accountDao" class="com.springinpractice.ch01.dao.jdbc.JdbcAccountDao"/>
<bean id="accountService"
class="com.springinpractice.ch01.service.AccountService">
<property name="accountDao" ref="accountDao"/>
</bean>
Avoir configuré les haricots comme ci-dessus, votre programme peut maintenant demander une instance de AccountService
à partir du Printemps ApplicationContext et le Printemps DI-cadre va s'occuper de instancié tout ce qui a besoin de l'instanciation.
- Vous vous posez la question, "quel est l'injection de dépendance"?
- A peu près. Je peux accepter que le CDI n'est plus de mon usine de classe (comme indiqué ci-dessous) mais je ne suis pas encore au clair sur ce qui plus est.
- Je serais probablement de la recherche autour pour le général DI/Cio info alors. Il y a de nombreux avantages, et duffymo de la mise à jour en réponse à ce commentaire résume parfaitement. Pour moi les trois premiers sont la clé, la quatrième est qu'une conséquence, et les mandataires/AOP n'entrez pas dans beaucoup, bien que j'utilise les deux.
Vous devez vous connecter pour publier un commentaire.
Les gens qui ont écrit CDI vous a donné un gros objet de l'usine; ils ont fait le travail pour vous, mieux que vous. C'est de configuration XML ou annotation conduit, donc vous n'avez pas à intégrer le tout dans le code.
Dépendance des moteurs à injection, comme le Printemps, de faire beaucoup plus que ce que votre usine. Ça va prendre plus d'une usine de classe et une seule ligne de code pour dupliquer tout ce qu'ils offrent.
Bien sûr, vous n'avez pas à l'utiliser. Vous êtes toujours libre d'inventer votre propre roue. Et vous devriez - si votre but est d'apprendre à faire des roues ou d'éliminer les dépendances.
Mais si vous voulez juste de développer des applications, il est préférable d'utiliser les outils à d'autres quand ils vous donner un avantage.
La de l'article séminal sur l'injection de dépendance a été écrit par Martin Fowler. Je vous recommande la lecture; il est encore grand, huit ans plus tard.
Voici quelques avantages:
Le but d'utiliser l'injection de dépendance est ainsi que le code à l'aide de la chose qui est injecté n'a pas une dépendance à l'usine. Avec votre code d'usine exemple, il y a une méthode statique d'appel intégré dans votre code qui n'est pas nécessaire avec la DI approche.
La chose qui est injecté avec
myFoo
ne devriez pas avoir à connaître à propos de l'usine.C'est une grande et subtile question à propos de ce qu'est l'entreprise de programmation est tout au sujet.
Le nom est bien choisi: les contextes et les dépendances.
CDI n'a rien à voir avec une meilleure ou la plus propre code, c'est à propos de s'assurer que les grandes organisations peuvent construire des complexes, distribués, systèmes de logiciels et de partager des données. Il s'agit de rendre sûr à 100% que les gouvernements ou d'autres bureaucraties peut indifféremment distribuer autonome, bien documenté, bien des forfaits pour tous les logiciels qu'ils contrôlent. Rappelez-vous que de nos jours, pratiquement toutes les POJO peut être injecté.
Disons que vous êtes en train de construire une application cliente d'une certaine sorte, et que vous voulez imprimer le prénom de l'utilisateur dans le coin.
Les architectes d'entreprise de cette grande compagnie voudrais que vous
ont cette capacité, mais en tant que junior, ingénieur logiciel, il n'y a pas de
chance de vous être remis les clés de la DB.
Ils aimeraient également de sécuriser les données à travers le réseau, mais l'
l'entreprise ne paye pas toutes les ingénieurs de re-ingénieur d'authentification
client à chaque fois qu'ils ont besoin de partager un morceau de données.
Ils le souhaitent pour que vous puissiez être en mesure d'interroger et de mettre à jour
cette info, mais souhaiterait que les transactions soient traitées plus
niveau que n'importe quelle application.
Qu'ils aimeraient pour vous d'être en mesure de tester vos classes avec trivial se moque dans le programme d'installation de blocs.
Qu'ils aimeraient pour le couplage entre les classes d'impliquer un minimum de méthodes statiques.
Et sur et sur et sur...
Plus Jsr ont probablement un "EAs voudrais être capable de..." enterrés à l'intérieur de quelque part.
CDI est préféré car il permet aux applications de grande taille (arbitraire?) horizontale et verticale des échelles de partager des contextes, des dépendances, et donc de données.
Dans Fowler mots:
En un mot, ils permettent centralisé "de commandement et de contrôle" des applications d'entreprise complexes. Java EE est systématisée, la fiabilité de la procédure d'abstraction et CDI, est une incarnation de ce qui fonctionne si bien, il rend presque invisible. Il fait de la couture ensemble du complexe apps presque banale.
Deux choses:
Noter que les CDI existe en paix aux côtés de la "localisateur de service pattern", connu comme JNDI dans Java EE, ce qui est préférable si le développeur client devra choisir parmi de nombreux de même tapé des solutions de rechange.
CDI est plus de puissance de feu que ce qui est nécessaire dans de nombreux cas, en particulier les non-enterprise (littéralement) des cas.
À un niveau élevé, comme avec la plupart des choses sur la fac d'informatique, il propose un niveau d'indirection (ou abstraction) qui serait autrement être codé en dur dans votre application comme
Foo myFoo = new Foo();
. Cette indirection apporte faiblement couplé code, ce qui rend les choses modulaire, ce qui le rend facile pour le remplacement, l'entretien, l'essai, etc classes ou sous-systèmes dans une manière plus simple.Remarque qu'il ya beaucoup de conceptions et de modèles pour l'indirection/abstraction - l'injection de dépendance est juste un.
L'autre aspect de votre question est "Pourquoi CDI?" - eh bien, parce que quelqu'un a déjà fait le travail pour vous. Vous pouvez toujours construire vos propres trucs, mais c'est généralement une perte de temps lorsque l'objectif est de construire un véritable système du monde qui doit effectuer en vertu de budget et de temps. Pourquoi s'embêter avec de l'épicerie et de la cuisson, quand il y a un chef étoilé qui est prêt à faire ce travail pour vous?