52 votes

Pourquoi utiliser 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 peut faire

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 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 tiré de Printemps, dans la Pratique, en prenant un exemple d' AccountService de la 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>

Après avoir configuré les haricots comme ci-dessus, votre programme peut maintenant demander une instance d' AccountService depuis le Printemps ApplicationContext et le Printemps DI-cadre va s'occuper de instancié tout ce qui a besoin de l'instanciation.

50voto

duffymo Points 188155

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.

L'injection de dépendance moteurs, 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 le faire, 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.

L' article fondateur 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.

"toujours pas clair sur ce que le plus est"

Voici quelques avantages:

  1. Un couplage lâche
  2. Tester plus facilement
  3. Mieux superposition
  4. Basé sur l'Interface de conception
  5. Proxies dynamiques (segue à AOP).

19voto

Nathan Hughes Points 30377

Le but de l’utilisation de l’injection de dépendance est que le code utilisant la chose injectée n’ait pas de dépendance à l’usine. Dans votre exemple de code d'usine, il existe un appel de méthode statique intégré à votre code qui n'est pas nécessaire avec l'approche DI.

La chose qui reçoit myFoo ne devrait pas avoir à connaître l’usine.

4voto

DeepSpace101 Points 1973

À un niveau élevé, comme avec la plupart des choses sur la fac d'informatique, il offre un niveau d'indirection (ou abstraction) qui serait autrement être codé en dur dans votre application en tant que 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.

Notez qu'il ya beaucoup de dessins et modèles pour les 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 créer 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?

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