Freut mich, dich kennenzulernen. Ich bin noch ein junger Mensch mit weniger als 2 Jahren Erfahrung als Programmierer, aber ich werde nach und nach das ausgeben, was ich studiert habe. Wenn Sie Fehler haben, lassen Sie es uns bitte wissen.
Vorerst werde ich kurz zusammenfassen, was ich über DI (DI-Container, der es implementiert) gelernt habe, das das Kernsystem des Java-Frameworks ist, das ich bisher irgendwie verwendet habe, auch als Test für das Posten.
Abkürzung für Dependency Injection. Ein Software-Design-Muster, das das Prinzip des IOC (Inversion of Control) verwirklicht. Festlegen einer Klasse (vorübergehend als Komponentenklasse bezeichnet), die für eine bestimmte Klasse erforderlich ist (vorübergehend als Schnittstellenklasse bezeichnet) (diese Einstellungsoperation wird auch als "Injektion" bezeichnet). Mit DI ist es möglich, die Generierung und Abhängigkeiten der Instanzen, aus denen die Logik besteht, von der Schnittstellenklasse zu trennen.
Mit zunehmendem Umfang der Anwendungsentwicklung wird häufig eine Logik implementiert, indem mehrere Komponentenklassen kombiniert werden. In diesem Fall steigt der Verbindungsgrad der Klassen allmählich an, und die Änderungskosten aufgrund des teilweisen Austauschs der Implementierung steigen.
//Schnittstellenklasse, die die benutzerbezogene Verarbeitung übernimmt
public class UserServiceImpl implements UserService {
//Komponentenklasse in Bezug auf die Datenpersistenz
private UserRepository userRepo;
private AddressRepository addressRepo;
/*Konstrukteur*/
public UserServiceImpl() {
this.userRepo = new UserRepositoryImpl();
this.addressRepo = new AddressRepositoryImpl();
}
}
Bei der Implementierung einer solchen Klasse müssen die Komponentenklassen (UserRepositoryImpl und AddressRepositoryImpl) im Voraus vorhanden sein. Wenn diese unvollständig sind, werden Sie wahrscheinlich eine Dummy-Klasse verwenden, aber mit zunehmender Entwicklungsskala können Sie sogar die Dummy-Klasse ersetzen. Die Änderungskosten erhöhen sich.
Um den Kopplungsgrad solcher Klassen zu verringern, implementieren wir ihn auf der Grundlage des DI-Konzepts. Insbesondere ist es möglich, die Instanziierung der Komponentenklasse innerhalb der Schnittstellenklasse zu beenden und die Schnittstelle der Komponentenklasse als Argument zu empfangen.
Java.UserServiceImpl
/*Konstrukteur*/
public UserServiceImpl(UserRepository userRepo,AddressRepository addressRepo) {
this.userRepo = userRepo;
this.addressRepo = addressRepo;
}
Java.UserService-Anrufverarbeitung
UserRepository userRepo = new UserReposiotryImpl();
AddressRepository addressRepo = new AddressRepositoryImpl();
UserService userService = new UserServiceImpl(userRepo,addressRepo);
Auf diese Weise kann der Aufrufer die Dummy- und Komponentenimplementierungsklasse ersetzen, ohne das Innere von UserServiceImpl zu ändern. Selbst mit der obigen Implementierung wird die Einstellung jeder Komponentenklasse für die Schnittstellenklasse manuell vorgenommen, und die Änderungskosten bleiben hoch. Wenn möglich, möchte ich auch alle diese Einstellungen automatisieren. Der DI-Container macht dies möglich.
Die Plattform, die DI automatisch ausführt, wird als DI-Container bezeichnet. Die Aufruferklasse einer Schnittstelle (als Anruferklasse bezeichnet) konfiguriert oder implementiert die Schnittstellenklasse nicht manuell wie oben beschrieben. Sie können eine Instanz der Schnittstellenklasse mit der über den DI-Container festgelegten Komponentenklasse abrufen. Wenn eine Komponentenklasse von einer anderen Komponentenklasse abhängt, wird sie natürlich auch konfiguriert.
//Implementierung durch die DI-Containerfunktion von Spring
//Alle Einstellungen für den DI-Container im Voraus abgeschlossen
public class UserServiceImpl implements UserService {
@Inject
private UserRepository userRepo;
@Inject
private AddressRepository addressRepo;
}
Abhängigkeitsauflösung: Abhängigkeiten zwischen Schnittstellenklasse und Komponentenklasse können aufgelöst werden Umfangssteuerung ist möglich: Der Zeitpunkt von der Instanziierung bis zur Zerstörung der Komponentenklasse kann individuell eingestellt werden. Es kann gesteuert werden, dass einige Komponentenklassen als Singleton-Objekte wiederverwendet werden und einige Komponentenklassen jedes Mal neu erstellt werden. Bereitstellen von AOP: Beim Abrufen einer Komponentenklasse aus einem DI-Container kann die allgemeine Verarbeitung einheitlich eingefügt werden. Darüber hinaus ist eine Lebenszyklussteuerung usw. möglich.
Die Beziehung zwischen einer Schnittstellenklasse und einer Komponentenklasse ist relativ, und es ist durchaus möglich, dass eine Klasse, die eine Schnittstellenklasse für eine Klasse ist, eine Komponentenklasse für eine andere Klasse ist.
Recommended Posts