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.
InformationsquelleAutor PhilDin | 2012-10-24