[JAVA] Je n'ai pas compris la signification de DI, @Autowired ou injection, alors j'ai recherché.

Objectif

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! !!

La partie qui n'a pas pu être organisée sur DI

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.

1. Qu'est-ce que DI D?

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.

2. Quel est le problème avec la dépendance

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.

3. Qu'est-ce que DI I?

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 est une injection de dépendance (résumé)

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

Je n'ai pas compris la signification de DI, @Autowired ou injection, alors j'ai recherché.
[Vue Action :: Modèle manquant] Je n'ai pas compris la signification de l'instruction d'erreur, alors je l'ai recherchée.
Je ne comprenais pas le tri topologique, alors je l'ai recherché et mis en œuvre dans BFS, puis j'ai essayé de résoudre le problème d'AtCoder.
J'ai fait la construction Docker des rails + postgresql comme officiel, mais cela n'a pas fonctionné, alors j'ai corrigé certains
Je ne comprends pas la méthode devise_parameter_sanitizer, je vais donc l'afficher ici.
Je l'ai utilisé sans connaître la cartographie O / R des rails, donc je l'ai vérifié.