Quel est le sujet de Dependency Injection & Spring Framework?

Doublons possibles:
Qu’est-ce que l’dependency injection?
A quoi sert exactement le spring?

Je veux savoir qu’est- ce que Spring Framework? Pourquoi et quand faut-il l’utiliser dans le développement de Java Enterprise? La réponse serait “Un cadre d’dependency injection”. Très bien, quels sont les avantages de l’utilisation des frameworks d’dependency injection? L’idée de décrire des classes avec des valeurs de setter et / ou des parameters de constructeur me semble étrange. Pourquoi faire ça? Parce que nous pouvons changer les propriétés sans recomstackr le projet? Est-ce tout ce que nous gagnons?

Ensuite, quels objects devrions-nous décrire dans beans.xml? Tous les objects ou seulement quelques-uns?

Les réponses les plus simples sont les bienvenues

Nous utilisons l’dependency injection (DI) pour mettre en œuvre un couplage lâche . Le choix d’un conteneur DI particulier n’est pas si important.

Chaque fois que vous créez une instance d’une classe à l’aide du new mot-clé, vous associez étroitement votre code à cette classe et vous ne pourrez pas remplacer cette implémentation particulière par une autre (du moins sans recomstackr le code).

Cela ressemblerait à quelque chose comme ceci en C # (mais serait équivalent en Java):

 public class MyClass { public ssortingng GetMessage(int key) { return new MessageService().GetMessage(key) } } 

Cela signifie que si vous souhaitez utiliser ultérieurement un autre MessageService, vous ne pouvez pas.

D’autre part, si vous injectez une interface dans la classe et adhérez au principe de Liskov Substition , vous pourrez faire varier le consommateur et le service indépendamment.

 public class MyClass { private readonly IMessageService messageService; public MyClass(IMessageService messageService) { if(messageService == null) { throw new ArgumentNullException("messageService"); } this.messageService = messageService; } public ssortingng GetMessage(int key) { return this.messageService.GetMessage(key) } } 

Bien que cela semble plus compliqué, nous avons maintenant réussi à suivre le principe de responsabilité unique en veillant à ce que chaque collaborateur ne fasse qu’une seule chose et que nous puissions varier les deux indépendamment l’un de l’autre.

De plus, nous pouvons maintenant changer le comportement de MyClass sans changer la classe elle-même, adhérant ainsi au principe Open / Closed .

La reconfiguration est surestimée. La chose la plus importante que vous obtenez de l’utilisation de DI est la testabilité . Puisque vos classes ne dépendent pas des implémentations, mais des abstractions, vous pouvez les remplacer par des imitations / stubs dans vos tests unitaires.

Exemple

Sans DI:

 class SaleAction{ private BillingService billingService; public SaleAction(){ billingService = new CreditCardService(); //dependency is hardcoded } public void pay(long amount){ //pre payment logic billingService.pay(amount); //post payment logic } } 

Dans cet exemple, supposons que vous souhaitiez tester un peu la logique de pré-paiement et la logique de post-paiement de SaleAction … vous ne pouvez pas, car SaleAction est couplé à CreditCardService et l’exécution de vos tests générera probablement de faux paiements.

Maintenant, le même exemple avec DI:

  class SaleAction{ private BillingService billingService; public SaleAction(BillingService service){ billingService = service; //DI } public void pay(long amount){ //pre payment logic billingService.pay(amount); //post payment logic } } 

Désormais, SaleAction est découplé de toute implémentation, ce qui signifie que dans votre test, vous pouvez effectuer SaleAction action = new SaleAction(new DummyBillingService()); .

Espérons que cela aide, il y a aussi l’ article sur la DI, écrit par Martin Fowler que vous pouvez trouver ici

Le spring est devenu un vaste cadre qui risque de vous dérouter si vous essayez seulement de vous préparer à l’dependency injection. Le projet Google Guice est minuscule et ne réalise que DI avec Java pur – pas de XML ni de figurants. Il y a une belle vidéo d’introduction expliquant aussi DI. http://code.google.com/p/google-guice/

Voici un bon article expliquant les idées du spring. (Par Rod Johnson, le fondateur du framework Spring)

Vous avez déjà quelques bonnes réponses ici, je veux aborder quelques questions spécifiques que vous avez:

L’idée de décrire des classes avec des valeurs de setter et / ou des parameters de constructeur me semble étrange. Pourquoi faire ça? Parce que nous pouvons changer les propriétés sans recomstackr le projet? Est-ce tout ce que nous gagnons?

Cela semble étrange au début, mais le fait est que le conteneur est responsable de la connexion des dépendances pour les objects, les objects eux-mêmes n’en sont pas responsables. La scope des objects configurés dans beans.xml est gérée par Spring, nous n’avons donc pas à nous inquiéter autant des choses instanciées sans les dépendances appropriées (tant que la configuration est correcte, il est bien connu d’écrire des tests unitaires pour vérifier que la configuration du ressort fait ce que je veux.)

Ensuite, quels objects devrions-nous décrire dans beans.xml? Tous les objects ou seulement quelques-uns?

Les types d’objects décrits dans beans.xml sont principalement des composants – des contrôleurs, des services, des objects d’access aux données et des éléments dont ils ont besoin comme des gestionnaires de transactions, des fabriques de sessions en veille prolongée, des sources de données, etc. Les objects de domaine sont généralement récupérés à partir d’objects d’access aux données ou instanciés directement, car ils ne dépendent d’aucun autre object que le domaine (ou de classes d’utilitaires encore plus indépendantes que les classes de domaine).

Je pense que je peux répondre à la question, même si je ne suis pas sûr que toute réponse sera satisfaisante.

La réponse facile est que Spring est une combinaison de technologies:

  1. dependency injection, qui utilise le principe d’Hollywood pour vous aider à garder l’interface et la mise en œuvre séparées;
  2. la programmation orientée aspect, qui isole les problèmes transversaux en modules que vous pouvez appliquer de manière déclarative. Le «monde de salut» d’AOP est en cours de journalisation, mais tout est au rendez-vous (transactions, proxy dynamics pour la communication à distance, sécurité, etc.). Pensez aux filtres de servlet et vous en aurez une idée.
  3. des bibliothèques pour aider aux tâches courantes telles que la persistance (JDBC, Hibernate, iBatis, JDO, JPA, etc.), la communication à distance (RMI, HTTP, les services Web), la messagerie asynchrone (POJOs pilotés par message), la validation et la liaison, Web MVC (Spring ou Struts), des utilitaires comme le courrier électronique, la planification, la sécurité, etc.

Mais la réponse la plus profonde est que vous bénéficiez de l’expérience de Rod Johnson en tant que consultant sur des projets Java EE. Il a distillé ce qui avait fonctionné pour lui lors de ses concerts dans Interface 21 / Spring, et vous pouvez maintenant en profiter gratuitement.

L’équipe Spring écrit un code conçu, testé et conforme aux normes plus rigoureusement que tout ce que j’écrirai jamais. (Imaginez Juergen Hoeller qui frappe Rod Johnson parce que son code n’était pas conforme à la norme avant l’enregistrement). Je peux compter sur leur code-cadre lorsque je l’utilise et me concentrer sur mon problème commercial. Je n’écris pas encore et encore le code de la plaque de la chaudière.

Pour moi, Spring concerne plus un modèle architectural qui sert de guide pour la création d’applications Web. Certaines personnes diront peut-être que c’est trop technique, et pour certains problèmes, elles sont correctes, mais pour les types de problèmes auxquels je suis régulièrement confronté, le spring est tout indiqué.

En ce qui concerne les sous-questions:

Quels avantages avons-nous lorsque nous utilisons des frameworks d’dependency injection?

Les objects ne doivent pas être responsables de la gestion de leurs dépendances. Le contexte d’application de Spring n’est en réalité qu’un grand motif d’usine issu du GoF. Il vous encourage à concevoir une interface afin de pouvoir modifier l’implémentation en fonction des besoins. Votre interface de persistance pourrait utiliser une implémentation JDBC aujourd’hui, Hibernate demain; vous pouvez décider de générer automatiquement un proxy pour gérer son comportement transactionnel. Aucun code client ne doit changer si vous codez vers une interface.

L’idée de décrire des classes avec des valeurs de setter et / ou des parameters de constructeur me semble étrange. Pourquoi faire ça? Parce que nous pouvons changer les propriétés sans recomstackr le projet? Est-ce tout ce que nous gagnons?

Étrange? Vous n’utilisez pas de propriétés ou de constructeurs dans votre code? Vous le faites parce que c’est la façon dont la plupart des classes Java sont écrites. Spring utilise simplement ces mécanismes pour fournir des dépendances à la classe.

Ensuite, quels objects devrions-nous décrire dans beans.xml? Tous les objects ou seulement quelques-uns?

Seuls les haricots qui ont des dépendances. J’appelle toujours “nouveau” pour les objects qui sont locaux à une méthode particulière. Ils sont créés, utilisés et les ordures collectées dans la scope de la méthode. Ceux-ci n’ont pas besoin d’être sous le contrôle de Spring.

Opinion: Déterminez le problème que vous essayez de résoudre avec DI et choisissez le cadre qui vous convient le mieux. Spring pourrait append beaucoup de complexité à votre problème.

(Un des premiers articles de Martin Fowler sur DI . Je pense que le terme DI a été inventé dans cet article.)

Voici une bonne vidéo donnée par Bob Lee et deux de ses sous-études sur Guice (Guice est un framework d’dependency injection comme Spring). Les 10 premières minutes environ expliquent pourquoi Guice (ou l’dependency injection) serait meilleur que l’alternative (Usines); il n’ya donc pas que Guice.

Peut-être que vous ne devriez pas essayer d’entreprendre un «développement d’entreprise Java» sans une idée des préoccupations de base en matière d’architecture et de conception? Je vous suggère soit de trouver un collègue expérimenté disposé à vous aider, soit de déployer davantage d’efforts pour lire ces livres, ou de suivre un cours.

Dans tous les cas, il n’ya pas de «réponse simple» à votre question.

L’dependency injection est une solution de contournement pour les classes virtuelles manquantes!

NB: si vous ne savez pas ce que sont les classes virtuelles, veuillez vous référer à “Les classes virtuelles, ça vous tente?” .