[JAVA] Ich habe die Bedeutung von DI oder @Autowired oder Injektion nicht verstanden, also habe ich nachgeschlagen.

Zweck

Diejenigen, die denken "Was ist die Injektion von Abhängigkeit !! Was ist DI !!" Am Ende des Lesens ist es mein Ziel, "DI ist eine Injektion von Abhängigkeit, nicht wahr?" Zu werden.

Als ich Mr. Tokis Folie las, wurde ich zu "DI ist eine Injektion von Abhängigkeit". https://www.slideshare.net/KouheiToki/dispring

Sie müssen meinen Artikel nicht lesen, wenn Sie Mr. Tokis Folien lesen. Aber ich möchte, dass Sie es lesen, also bleiben Sie bitte eine Weile mit mir in Kontakt! !!

Der Teil, der über DI nicht organisiert werden konnte

Ich kam zum ersten Mal mit DI in Kontakt, als ich Spring's @Autowired verwendete. Es dauerte ungefähr ein halbes Jahr, nachdem ich meinen Job gewechselt hatte. Bis jetzt haben Java-Nachschlagewerke angegeben, dass "bei der Verwendung von Klassen neu gemacht werden sollte", aber ich war sehr verwirrt, weil ich das auf dem Gebiet überhaupt nicht getan habe.

Sample.java


@Autowired
Test test;
test.sayHello();

Da es funktioniert, machte es für mich zu der Zeit keinen Sinn, als ich die Schnittstelle oder ihre Implementierung nicht einmal kannte. Bewegt es sich durch Magie! !! Wann

Also, wenn Sie @Autowired, was ich nicht verstehe, auf der Website oder in Nachschlagewerken nachschlagen

** Abhängigkeitsspritze **

Völlig unverständlich! !! !! Dieses Wort hat mich sehr geärgert. Und selbst wenn ich die Erklärung und die Implementierung anhand des Beispiels gelesen habe, ist mir das nicht in den Sinn gekommen. Lesen Sie einfach Mr. Tokis Folie

DI → nur ein Entwurfsmuster DI-Container → Framework, das DI realisiert (@Autowired ist diese Geschichte)

In diesem Wissen war das, was ich im Nachschlagewerk las, in mir organisiert. Was Sie also wissen müssen, bevor Sie sich @Autowired ansehen, ist DI. Um zu wissen, was DI ist

** 1. Was ist DI D ** ** 2. Was ist los mit Abhängigkeit ** ** 3. Was ist DI I **

Ich möchte in der Reihenfolge schreiben.

1. Was ist DI D?

Angenommen, Sie haben ein Anwesenheitsüberwachungsprogramm. Das Anwesenheitsüberwachungsprogramm wird A kontaktieren und ihm mitteilen, wo er sich befindet, wenn er morgens schwach ist und während der Öffnungszeiten nicht zur Arbeit geht.

Main.java


public class Main {
    public static void main(String[] args) {
        //Stellen Sie Ihre Informationen ein
        SomeOne aKum = new Akun();
        aKum.setName("Herr A.");
        aKum.setNumber(09095171835);
        AttendanceMonitor monitor = new AttendanceMonitor();
        // monitor.tellWhereHeIs(aKum)Ich werde dir sagen, wo A ist.
        String akumsPlace = monitor.tellWhereHeIs(aKum); 
    }
}

AttendanceMonitor.java


class AttendanceMonitor {
    private Call call;//Eine Klasse, um einen Anruf zu tätigen und Ihren Aufenthaltsort zu bestätigen
    AttendanceMonitor() {
        //Teil D dieses Themas
        call = new Call();
    }
    public String tellWhereHeIs(Latecomer latecomer) {
        return call.findOnesPlace(latecomer);
    }
}

In diesem Beispiel hängt die AttendanceMonitor-Klasse von der Call-Klasse ab. Was ist Abhängigkeit überhaupt? Ich habe es nicht klar in die japanische Wikipedia geschrieben, also aus der englischen Wikipedia

A "dependency" is an object that can be used, for example as a service.

Ich denke, dass Abhängigkeit so etwas wie ** Objekt ** bedeutet, das als Dienst verwendet wird (ist es eine Verarbeitungsbedeutung?). Abhängigkeiten beziehen sich auf Objekte. In diesem Fall verwendet die AttendanceMonitor-Klasse die Call-Klasse Die neue Call-Klasse in der AttendanceMonitor-Klasse ist "Abhängigkeit".

Es wird gesagt, dass es vom Status abhängt, dass AttendanceMonitor ohne neue Call-Klasse nicht generiert werden kann.

2. Was ist los mit Abhängigkeit?

Abhängige Objekte reagieren nicht flexibel auf Änderungen.

In diesem Beispiel wird Herr A telefonisch kontaktiert. Es ist jedoch schwierig, jedes Mal anzurufen. Es kostet auch eine Telefonrechnung. Nehmen wir also an, Sie wechseln zum Leitungskontakt.

In diesem Fall müssen Sie die folgende Klasse ändern, wenn dies von der Call-Klasse abhängt.

AttendanceMonitor.java


class AttendanceMonitor {
    //private Call call;//Gelöscht, weil es in Zeile geändert wurde
    private Line line;
    AttendanceMonitor() {
        //call = new Call();//Gelöscht, weil es in Zeile geändert wurde
        line = new Line ();    
    }
    public String tellWhereHeIs(Latecomer latecomer) {
        // String onesPlace = call.findOnesPlace(latecomer);//Gelöscht, weil es in Zeile geändert wurde
        return line.findOnesPlace(latecomer);
    }
}

Ich habe den Anwesenheitsmonitor an drei Stellen geändert, obwohl ich gerade die Kontaktmethode geändert habe. Da dies ein Beispiel ist, gibt es drei Stellen, aber es kann weitere Änderungen im Code geben, der im tatsächlichen Geschäft verwendet wird. Nachdem wir den AttendanceMonitor repariert haben, müssen wir auch den AttendanceMonitor testen.

Die Abhängigkeit macht es Ihnen unflexibel, auf Änderungen zu reagieren.

Die Lösung ist Injektion. Mit anderen Worten, es ist der I-Teil (Injektion) von DI.

3. Was ist DI I?

In diesem Beispiel hängt die ** AttendanceMonitor-Klasse von der Call-Klasse ab. ** ** ** Wenn ich die Art und Weise ändern wollte, wie ich mit Mr. A Kontakt zu Line usw. aufnehmen konnte, musste ich die AttendanceMonitor-Klasse ändern. Die Inflexibilität für diese Änderung ist ** Implementieren Sie die Schnittstelle und fügen Sie die Instanz ein, um sie zu lösen **

AttendanceMonitor.java


class AttendanceMonitor {
    //private Line line; 
    private Contact contact;//Kontaktschnittstelle
    AttendanceMonitor(Contact contact) {
        //line = new Line (); //Instanziieren Sie abhängige Klassen nicht mit new
        //Anrufer(Hauptklasse)Verwenden Sie die von übergebene Instanz
        contact = contact; 
    }
    public String tellWhereHeIs(Latecomer latecomer) {
        return contact.findOnesPlace(latecomer);
    }
}

Line.java


public class Line implements Contact {
    @Override 
    public String findOnesPlace(Latecomer latecomer){
       //Körperbehandlung, die die Person kontaktiert, die spät dran ist und den Aufenthaltsort zurückgibt
    }
}

Contact.java


public interface Contact{
    public String findOnesPlace(Latecomer latecomer);
}

AttendanceMonitor hängt nicht mehr von der Klasse der Kontaktmittel ab, indem Klassen extern injiziert werden. Ich habe in AttendanceMonitor keine neue Instanz erstellt.

Die externe Klasse ist in diesem Beispiel die Hauptklasse.

Main.java


public class Main {
    public static void main(String[] args) {
        //Stellen Sie Ihre Informationen ein
        SomeOne aKum = new Akun();
        aKum.setName("Herr A.");
        aKum.setNumber(09095171835);
        //Fügen Sie Abhängigkeiten ein, indem Sie auf der Benutzerseite instanziieren! !! !!
        Line line = new Line(); 
        AttendanceMonitor monitor = new AttendanceMonitor(line);
        monitor.tellWhereHeIs(aKum); 
    }
}

AttendanceMonitor wird lose gekoppelt, indem eine Instanz übergeben wird, wie Herr A aus der Hauptklasse kontaktiert werden kann. Unabhängig davon, ob Sie Herrn A in Zukunft mit einer Drohne oder einem bequemeren Kommunikationsmittel finden möchten, gilt die Änderung nur für die Klasse, die Sie verwenden.

Dank der Injektion von Abhängigkeiten.

DI ist eine Abhängigkeitsinjektion (Zusammenfassung)

DI war ein Entwurfsmuster. Es heißt, dass es von dem Teil abhängt, der in der Klasse neu ist, und um es zu beseitigen, übergibt der Aufrufer die Klasse, die Sie neu möchten. Wenn du das verstehen kannst

Sample.java


@Autowired
Test test;
test.sayHello();

Ich habe auch verstanden. Der DI-Container ist ein Framework, das verschiedene Dinge wie DI (AOP usw.?) Realisiert. @Autowired hat etwas Seltsames, aber alles, was Sie tatsächlich tun, ist, die Testklasse an die Sample-Klasse im Konstruktor zu übergeben! !! (Ich glaube nicht, dass es nur so ist)

Immerhin "DI ist eine Injektion von Abhängigkeit, nicht wahr?"

Recommended Posts

Ich habe die Bedeutung von DI oder @Autowired oder Injektion nicht verstanden, also habe ich nachgeschlagen.
[Aktionsansicht :: Fehlende Vorlage] Ich habe die Bedeutung der Fehleranweisung nicht verstanden und sie nachgeschlagen.
Ich habe die topologische Sortierung nicht verstanden, also habe ich sie nachgeschlagen und in BFS implementiert und dann versucht, das AtCoder-Problem zu lösen.
Ich habe die Docker-Konstruktion von Rails + Postgresql als offiziell durchgeführt, aber es hat nicht funktioniert, also habe ich einige Teile repariert.
Ich verstehe die Methode devise_parameter_sanitizer nicht, daher werde ich sie hier ausgeben.
Ich habe es verwendet, ohne die O / R-Zuordnung der Schienen zu kennen, also habe ich es überprüft.