[JAVA] Eine kurze Zusammenfassung der DI- und DI-Container

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.

Was ist DI?

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.

DI Hintergrund

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.

Was ist ein DI-Container?

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.

Implementierungsbeispiel

//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;
}

Vorteile der Verwendung eines DI-Containers

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.

Bemerkungen

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

Eine kurze Zusammenfassung der DI- und DI-Container
Zusammenfassung der einfachen Funktionen von Bootstrap für Anfänger
Zusammenfassung von FileInputStream und BufferedInputStream
Eine kurze Zusammenfassung der Rails-Zuordnungsoptionen (Foreign_key, Primary_key)
Eine kurze Erklärung von commitAllowingStateLoss
Eine kurze Beschreibung der JAVA-Abhängigkeiten
Zusammenfassung der Hashes und Symbole in Ruby
Zusammenfassung von Java Math.random und Import (Kalender)
Nur Zusammenfassung zum Einrichten des Rails-Tutorials
[Java] Persönliche Zusammenfassung der Klassen und Methoden (grundlegend)
Was sind die Vorteile von DI und Thymeleaf?
Zusammenfassung der japanischen Zeiteinstellung und Anzeigemethode
Zusammenfassung der häufig verwendeten Befehle in Rails und Docker
Zusammenfassung des ToString-Verhaltens mit Java- und Groovy-Annotationen
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Überprüfung der Beziehung zwischen dem Docker-Image und dem Container
Eine Aufzeichnung einer einfachen Berührung des GCP-Datenflusses
Über Bean und DI
Zusammenfassung der OpenJDK-Quellen
Über DI des Frühlings ①
JAR-Datei Übersicht
Über DI des Frühlings ②
Zusammenfassung zur Informationssicherheit
Zusammenfassung der Verwendung von FragmentArgs
Zusammenfassung der Verwendung von DBFlow
Zusammenfassung der Java-Unterstützung 2018
Das n-te und n + 1-Zeichen einer Ruby-Zeichenfolge
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Installieren Sie Ruby 3.0.0 Preview 1 mit einer Kombination aus Homebrew und rbenv