Ceux qui pensent "Qu'est-ce que l'injection de dépendance !! Qu'est-ce que DI !!" En fin de lecture, mon objectif est de devenir "DI est une injection de dépendance, n'est-ce pas?"
C'est en lisant la diapositive de M. Toki que je suis devenu "DI est une injection de dépendance". https://www.slideshare.net/KouheiToki/dispring
Si vous lisez la diapositive de M. Toki, vous n'avez pas besoin de lire mon article. Mais je veux que vous le lisiez, alors restez en contact avec moi pendant un moment! !!
Je suis entré en contact avec DI pour la première fois lorsque j'ai utilisé @Autowired de Spring. C'était environ six mois après avoir changé d'emploi. Jusqu'à présent, les livres de référence Java affirmaient que "du nouveau devrait être fait lors de l'utilisation de classes", mais j'étais très confus car je ne le faisais pas du tout sur le terrain.
Sample.java
@Autowired
Test test;
test.sayHello();
Parce que ça marche, ça n'avait pas de sens pour moi à l'époque où je ne connaissais même pas l'interface ou son implémentation. Est-ce que ça bouge par magie! !! Quand
Donc, si vous recherchez @Autowired, que je ne comprends pas, sur le site ou dans les livres de référence
** Injection de dépendance **
Totalement incompréhensible! !! !! J'ai été très ennuyé par ce mot. Et même si j'ai lu l'explication et la mise en œuvre à l'aide de l'exemple, cela ne m'est pas venu à l'esprit. Lisez la diapositive de M. Toki
DI → juste un modèle de conception Conteneur DI → Framework qui réalise DI (@Autowired est cette histoire)
Sachant cela, ce que j'ai lu dans le livre de référence était organisé en moi. Donc, ce que vous devez savoir avant de regarder @Autowired est DI. Pour savoir ce qu'est DI
** 1. Qu'est-ce que DI D ** ** 2. Quel est le problème avec la dépendance ** ** 3. Qu'est-ce que DI I **
Je voudrais écrire dans l'ordre de.
Par exemple, supposons que vous ayez un programme de surveillance des présences. Le programme de suivi des présences contactera A et lui dira où il se trouve s'il est faible le matin et ne va pas travailler pendant les heures d'ouverture.
Main.java
public class Main {
public static void main(String[] args) {
//Définir les informations de A
SomeOne aKum = new Akun();
aKum.setName("Monsieur A");
aKum.setNumber(09095171835);
AttendanceMonitor monitor = new AttendanceMonitor();
// monitor.tellWhereHeIs(aKum)Vous dira où se trouve A.
String akumsPlace = monitor.tellWhereHeIs(aKum);
}
}
AttendanceMonitor.java
class AttendanceMonitor {
private Call call;//Une classe pour passer un coup de fil pour confirmer vos allées et venues
AttendanceMonitor() {
//Partie D de ce thème
call = new Call();
}
public String tellWhereHeIs(Latecomer latecomer) {
return call.findOnesPlace(latecomer);
}
}
Dans cet exemple, la classe AttendanceMonitor dépend de la classe Call. Qu'est-ce que la dépendance en premier lieu? Je ne l'ai pas écrit clairement dans Wikipedia japonais, donc à partir de Wikipedia anglais
A "dependency" is an object that can be used, for example as a service.
Je pense que la dépendance signifie quelque chose comme ** objet ** utilisé comme service (est-ce une signification de traitement?). Les dépendances font référence aux objets. Dans ce cas, la classe AttendanceMonitor utilise la classe Call, donc La nouvelle classe Call de la classe AttendanceMonitor est «dépendance».
On dit que cela dépend de l'état dans lequel AttendanceMonitor ne peut pas être généré sans nouvelle classe Call.
Les objets dépendants ne sont pas flexibles pour répondre aux changements.
Dans cet exemple, M. A est contacté par téléphone. Cependant, il est difficile d'appeler à chaque fois. Cela coûte également une facture de téléphone. Alors disons que vous passez au contact de ligne.
Dans ce cas, si cela dépend de la classe Call, vous devez la modifier comme suit.
AttendanceMonitor.java
class AttendanceMonitor {
//private Call call;//Supprimé car il a été remplacé par Ligne
private Line line;
AttendanceMonitor() {
//call = new Call();//Supprimé car il a été remplacé par Ligne
line = new Line ();
}
public String tellWhereHeIs(Latecomer latecomer) {
// String onesPlace = call.findOnesPlace(latecomer);//Supprimé car il a été remplacé par Ligne
return line.findOnesPlace(latecomer);
}
}
J'ai changé le moniteur de présence à 3 endroits même si je viens de changer la méthode de contact. Puisqu'il s'agit d'un exemple, il y a trois endroits, mais il peut y avoir plus de changements dans le code utilisé dans les affaires réelles. Maintenant que nous avons corrigé le AttendanceMonitor, nous devons également tester l'unité AttendanceMonitor.
La dépendance vous rend inflexible pour répondre aux changements.
La solution est une injection. En d'autres termes, c'est la partie I (injection) de DI.
Dans cet exemple, la classe ** AttendanceMonitor dépend de la classe Call. ** ** Si je voulais changer la façon de contacter M. A en quelque chose comme Line, je devais modifier la classe AttendanceMonitor. La rigidité de ce changement est ** Implémentez l'interface et injectez l'instance pour la résoudre **
AttendanceMonitor.java
class AttendanceMonitor {
//private Line line;
private Contact contact;//Interface de contact
AttendanceMonitor(Contact contact) {
//line = new Line (); //Ne pas instancier de classes dépendantes avec de nouvelles
//Votre interlocuteur(Classe principale)Utilisez l'instance transmise depuis
contact = contact;
}
public String tellWhereHeIs(Latecomer latecomer) {
return contact.findOnesPlace(latecomer);
}
}
Line.java
public class Line implements Contact {
@Override
public String findOnesPlace(Latecomer latecomer){
//Traitement corporel qui contacte la personne en retard sur la ligne et lui indique où
}
}
Contact.java
public interface Contact{
public String findOnesPlace(Latecomer latecomer);
}
AttendanceMonitor ne dépend plus de la classe des moyens de contact en injectant des classes en externe. Je n'ai pas créé de nouvelle instance dans AttendanceMonitor.
La classe externe est la classe Main dans cet exemple.
Main.java
public class Main {
public static void main(String[] args) {
//Définir les informations de A
SomeOne aKum = new Akun();
aKum.setName("Monsieur A");
aKum.setNumber(09095171835);
//Injectez les dépendances en instanciant côté utilisateur! !! !!
Line line = new Line();
AttendanceMonitor monitor = new AttendanceMonitor(line);
monitor.tellWhereHeIs(aKum);
}
}
AttendanceMonitor devient faiblement couplé en passant une instance de la façon de contacter M. A de la classe principale. Ensuite, que vous souhaitiez trouver M. A avec un drone à l'avenir ou avec des moyens de communication plus pratiques, le changement sera limité à la classe que vous utilisez.
Grâce à l'injection de dépendances.
DI était un modèle de conception. Il dit que cela dépend de la partie qui est nouvelle dans la classe, et afin de l'éliminer, l'appelant passe la classe que vous souhaitez créer. Si tu peux comprendre ça
Sample.java
@Autowired
Test test;
test.sayHello();
J'ai aussi compris. Le conteneur DI est un framework qui réalise diverses choses telles que DI (AOP etc.?). Il y a quelque chose de bizarre à propos de @Autowired, mais tout ce que vous faites est de passer la classe Test à la classe Sample dans le constructeur! !! (Je ne pense pas que ce soit juste ça)
Après tout, "DI est une injection de dépendance, n'est-ce pas?"
Recommended Posts