Ich schreibe es, um mich selbst zu überzeugen, weil es nicht richtig aussieht, selbst wenn ich mir verschiedene Erklärungen ansehe.
Zuallererst, wenn es sich um einen Lehrbuchstil handelt
"DI realisiert" Inversion of Control Principle ", eines der Entwurfsmuster [^ 1]". Es ist möglich, die Erstellung von Instanzen, aus denen eine Komponente besteht, und die Auflösung von Abhängigkeiten vom Quellcode zu trennen. (Aus einer gründlichen Einführung in Spring durch die NTT DATA Corporation)
Ich weiß nicht, wovon du sprichst. Denken wir vorerst an einem Ort, der leicht zu verstehen ist.
[^ 1]: Sammlung von Design-Know-how in objektorientierten Sprachen
Was ist vorerst zu tun, was kann DI tun?
・ Reduzierte Abhängigkeit zwischen Klassen = lose Kopplung zwischen Klassen (wird lose Kopplung) ・ ↑ erleichtert die Wiederverwendung von Klassen usw. ・ ↑ erleichtert die Durchführung von Unit-Tests usw.
Es scheint, dass. Das Wort "Abhängigkeit" ist oft vorgekommen, daher scheint der Kern hier zu sein. Was sind also "Abhängigkeiten" in der Programmierung?
Wenn Sie Lehrbuchwörter verwenden, "Ein Modul ändert sich oder hängt vom internen Verhalten eines anderen Moduls ab = Wenn Sie die Spezifikationen eines abhängigen Moduls ändern, ist der Inhalt des Moduls wahrscheinlich beschädigt."
Was ist eine Konfiguration, die tatsächlich stark von der Java-Sprache usw. abhängt?
Hoge.java
class Hoge{
public void hoge(){
Fuga fuga = new Fuga();
}
}
Es ist ziemlich konkret geworden. Sie können sich vorstellen, dass Sie auch die aufrufende Methode ändern müssen, wenn Sie eine neue Klasse in einer Klasse verwenden und wenn sich der Konstruktor der neuen Klasse ändert. Wenn Sie außerdem die Methode in der Klasse ändern, die die Instanz erstellt, wird die Verarbeitung des Aufrufers durcheinander gebracht. Die Lösung für dieses Problem besteht darin, dass die aufrufende Klasse die Schnittstelle verwendet, anstatt eine Instanz zu erstellen, indem die Implementierungsklasse neu erstellt wird, und dass die neue Klasse eine Klasse wird, die die Schnittstelle erbt. Das ist.
Fuga.java
pulic interface Fuga{
int a;
void foo();
}
HogeFuga.java
pulic HogeFuga implements Fuga{
int a;
void foo(){
fugafuga;
};
}
Hoge.java
class Hoge{
public void hoge(){
Fuga fuga = new HogeFuga();
}
}
Mit dieser Methode können Sie die Klasse, die die Schnittstelle implementiert, frei verwenden und die Abhängigkeit verringern. Da die Schnittstellenklasse jedoch nicht neu sein kann, muss die implementierte Unterklasse beim Aufrufer als neu beschrieben werden.
Beschreiben Sie daher die Beziehung mithilfe einer XML-Datei oder einer Anmerkung. ↓ Dies ist "DI"
Hoge.java
class Hoge{
Fuga fuga;
public void hoge(){
}
public void setFuga(Fuga fuga){
this.fuga = fuga;
}
}
Zu diesem Zeitpunkt kann jede Klasse, die die Fuga-Klasse implementiert, an die setFuga-Klasse übergeben werden, und der Hoge-Klasse ist es egal, welche Klasse tatsächlich verwendet wird.
Ist dies der Mainstream bei der Verwendung von Spring?
Hoge.java
class Hoge{
@Autowired
protected Fuga fuga
public void hoge(){
}
}
Was ist DI? = Ich möchte die Bindung der von mir verwendeten Klasse reduzieren!
Recommended Posts