Je comprends les avantages de l'injection de dépendance elle-même. Prenons le Printemps par exemple. Je comprends aussi les avantages de Printemps d'autres featureslike AOP, aides de différents types, etc. Je me demandais simplement, quels sont les avantages de XML de configuration, comme par exemple:
<bean id="Mary" class="foo.bar.Female">
<property name="age" value="23"/>
</bean>
<bean id="John" class="foo.bar.Male">
<property name="girlfriend" ref="Mary"/>
</bean>
par rapport à plain old java le code tel que:
Female mary = new Female();
mary.setAge(23);
Male john = new Male();
john.setGirlfriend(mary);
ce qui est plus facile à déboguer, compiler temps vérifié et peut être comprise par quelqu'un qui ne connaît que java. Alors, quel est le but principal d'une infrastructure d'injection de dépendance? (ou un morceau de code qui montre ses avantages.)
Mise à JOUR:
En cas de
IService myService;// ...
public void doSomething() {
myService.fetchData();
}
Comment peut-Cio cadre de deviner que la mise en œuvre de myService je veux être injecté si il n'y a plus d'un? Si il y a une seule mise en œuvre de l'interface donnée, et je la laisse conteneur IoC automatiquement décider de les utiliser, il sera cassé après une deuxième mise en œuvre apparaît. Et si il est intentionnellement seule possible la mise en œuvre d'une interface, alors vous n'avez pas besoin de se l'injecter.
Il serait vraiment intéressant de voir un petit morceau de la configuration du Cio qui montre les bénéfices. J'ai été en utilisant le Printemps pour un certain temps et je ne peux pas fournir un tel exemple. Et je peux montrer des lignes simples qui démontrent les avantages de la mise en veille prolongée, la dsr, et d'autres cadres que j'utilise.
Mise à JOUR 2:
Je me rends compte que la Coi de configuration peut être changée sans avoir à recompiler. Est-ce vraiment une bonne idée? Je peux comprendre quand quelqu'un veut changer DB informations d'identification sans recompiler - il est peut-être pas développeur. Dans votre pratique, comment souvent quelqu'un d'autre que développeur changements Cio de configuration? Je pense que pour les développeurs, il n'y a aucun effort pour recompiler la classe particulière au lieu de changer de configuration. Et pour les non-développeurs, vous auriez probablement eu envie de rendre sa vie plus facile et de fournir un peu plus simple fichier de configuration.
Mise à JOUR 3:
Configuration externe de la cartographie entre les interfaces et leurs implémentations concrètes
Quel est si bon en rendant extenal? Vous ne faites pas tout votre code externe, alors vous avez certainement peut - il suffit de le placer dans ClassName.java.txt fichier, lire et compiler manuellement à la volée - wow, vous éviter de recompiler. Pourquoi devrait-compilation-elle être évitée?!
Vous enregistrez le codage du temps parce que vous fournir des mappages de manière déclarative, non pas dans un code de procédure
Je comprends que, parfois, approche déclarative permet de gagner du temps. Par exemple, je déclare qu'une seule fois un mappage entre un haricot de propriété et d'une base de colonne et hibernate utilise cette cartographie pendant le chargement, la sauvegarde, la construction de SQL basé sur HSQL, etc. C'est là que l'approche déclarative de travaux. En cas de Printemps (dans mon exemple), la déclaration n'avait plus de lignes et avait la même expressivité que code correspondant. Si il y a un exemple lorsque la déclaration est plus court que le code - je voudrais le voir.
L'Inversion de Contrôle principe permet de faciliter les tests unitaires parce que vous pouvez remplacer les mises en production avec de faux (comme le remplacement de la base de données SQL avec une mémoire de l'un)
Je ne comprends d'inversion de contrôle (je préfère l'appeler la conception motif évoqué ici que l'Injection de Dépendance, parce que le Cio est plus général: il existe de nombreux types de contrôle, et nous sommes en inversant seulement l'un d'eux - le contrôle de l'initialisation). J'ai été demander pourquoi quelqu'un aurait besoin d'autre chose que d'un langage de programmation. Je ne peut certainement remplacer les mises en production avec de faux à l'aide de code. Et ce code permettra d'exprimer la même chose que de la configuration, il suffit d'initialiser les champs avec des fausses valeurs.
mary = new FakeFemale();
Je ne comprends avantages de la DI. Je ne comprends pas quels sont les avantages ajoutés par XML externe configuration par rapport à la configuration de code qui fait la même chose. Je ne pense pas que la compilation doit être évitée - je compiler tous les jours et je suis encore en vie. Je pense que la configuration de DI est le mauvais exemple de l'approche déclarative. La déclaration peut être utile s'est déclaré une fois ET est utilisée plusieurs fois de différentes façons - comme hibernate cfg, où la correspondance entre la fève de la propriété et de la colonne DB est utilisé pour l'enregistrement, de chargement, de la construction des requêtes de recherche, etc. Printemps DI configuration peut être facilement traduit à la configuration de code, comme dans le début de cette question, ne peut-il pas? Et il est utilisé uniquement pour l'initialisation du bean, n'est-ce pas? Ce qui signifie une approche déclarative ne pas ajouter quoi que ce soit ici, n'est ce pas?
Lorsque je déclare hibernate mapping, je viens de donner hibernate quelques informations, et il travaille en se fondant sur elle - je ne pas lui dire quoi faire. En cas de printemps, ma dit la déclaration de printemps exactement wht à faire, alors pourquoi le déclarer, pourquoi ne pas le faire?
DERNIÈRE MISE À JOUR:
Les gars, beaucoup de réponses sont de me dire à propos de l'injection de dépendance, dont je SAIS qu'elle EST BONNE.
La question est sur le but de DI configuration, au lieu de l'initialisation de code - j'ai tendance à penser que l'initialisation du code est plus court et plus clair.
La seule réponse que j'ai eu jusqu'à présent à ma question, c'est qu'il évite de recompiler, lorsque les changements de configuration. Je suppose que je devrais poster une autre question, parce que c'est un grand secret pour moi, raison pour laquelle la compilation doit être évitée dans ce cas.