IoC und DI
Der Spring Container ist die zentrale Komponente des Spring Frameworks, die die Erstellung, Konfiguration und den Lebenszyklus von Beans (Objekten) innerhalb einer Anwendung verwaltet. Der Spring Container wird auch als IoC-Container bezeichnet.
Eine Abhängigkeit bezeichnet jede Klasse, die andere Objekte benötigt, um ordnungsgemäß zu funktionieren, wobei diese Kette von Abhängigkeiten theoretisch unendlich fortgesetzt werden kann. Normalerweise müssen wir, um ein Objekt mit Abhängigkeiten zu erstellen, dieses explizit mit dem new-Operator initialisieren und die Klasse angeben.
Genau hier greift Spring mit Inversion of Control und Dependency Injection ein. Die Idee ist, dass Spring die Verantwortung für die Erstellung und Verwaltung von Abhängigkeiten übernimmt. Anstatt die Einrichtung manuell vorzunehmen, annotieren wir einfach die benötigten Klassen, und Spring erstellt diese automatisch und verwaltet ihren Lebenszyklus innerhalb seines Kontexts.
Eine dieser Annotationen ist @Component, die wir oberhalb der Klasse platzieren.
BeanExample.java
123@Component public class BeanExample { }
Dieser Ansatz verlagert den Fokus weg von der manuellen Verwaltung von Abhängigkeiten, sodass sich Entwickler auf die Geschäftslogik konzentrieren können, während Spring die Infrastrukturaufgaben im Zusammenhang mit Objekterstellung und Abhängigkeitsverwaltung übernimmt.
Wie funktioniert der Spring-Container?
Beim Start der Anwendung wird der Spring Container initialisiert. Er beginnt damit, die Klassen nach Annotationen wie @Component, @Service, @Repository und @Configuration zu durchsuchen.
@Component ist eine allgemeine Annotation, die eine Klasse von Spring verwalten lässt, sodass sie als Bean registriert werden kann.
@Service, @Repository und @Controller sind spezialisierte Varianten von @Component. Sie erfüllen denselben Zweck, kennzeichnen jedoch die spezifische Rolle der Klasse: @Service für Geschäftslogik, @Repository für Datenzugriff und @Controller für Bearbeitung von Webanfragen.
@Configuration wird für Klassen verwendet, die Bean-Definitionen und Konfigurationen der Anwendung enthalten.
Durch das Markieren einer Klasse mit einer dieser Annotationen wird sichergestellt, dass sie als Bean im Spring-Kontext verfügbar ist.
Sobald die Klassen identifiziert wurden, erstellt der Container Instanzen dieser annotierten Klassen und wandelt sie damit in Beans um, die vom Spring-Kontext während des gesamten Lebenszyklus der Anwendung verwaltet werden.
Während diese Beans erstellt werden, übernimmt der Container automatisch deren Abhängigkeiten durch Dependency Injection. Dieser Prozess ermöglicht es Klassen, die notwendigen Abhängigkeiten zu erhalten, ohne sie explizit erstellen oder finden zu müssen, was den Entwicklungsprozess vereinfacht.
Dependency Injection (DI)
Zunächst fügt der Spring Container seinem Kontext die Beans (Klassen) hinzu, die mit den Annotationen @Component, @Service, @Repository und @Configuration gekennzeichnet sind. Anschließend stellt er diese Beans allen Objekten zur Verfügung, die sie anfordern.
Praxisbeispiel
Stellen Sie sich vor, Sie entwickeln einen Online-Shop. Sie haben eine Klasse OrderService, die Bestellungen verwaltet, und eine Klasse PaymentService, die Zahlungen abwickelt. Anstatt eine Instanz von PaymentService manuell innerhalb von OrderService zu erstellen, kann der Spring Container die Instanz von PaymentService erzeugen und in OrderService einfügen.
OrderService.java
PaymentService.java
1234567891011121314@Service public class OrderService { private final PaymentService paymentService; public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
In der Klasse OrderService befindet sich ein Feld paymentService, das mit dem genau benötigten Typ (PaymentService) initialisiert wird. Beachten Sie, dass dieses Objekt nicht explizit von uns initialisiert wurde, sondern Spring dies für uns übernommen hat!
Wäre PaymentService nicht mit @Service annotiert worden, wäre dieser Bean nicht zum Spring-Kontext hinzugefügt worden und es wäre ein Fehler aufgetreten, der darauf hinweist, dass Spring keinen solchen Bean finden konnte.
@Autowired
Die Annotation @Autowired kann ebenfalls verwendet werden. Sie weist den Spring Container an, das passende Objekt in das entsprechende Feld zu injektieren.
OrderService.java
123456789101112131415@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
In Spring ist ab Version 4.3 die Verwendung der @Autowired-Annotation beim Injizieren von Abhängigkeiten über einen Konstruktor nicht mehr erforderlich, sofern es nur einen Konstruktor in der Klasse gibt. Spring erkennt automatisch, dass dieser Konstruktor für die Abhängigkeitsinjektion verwendet werden soll.
Welche verschiedenen Typen von Beans gibt es?
Stellen Sie sich vor, Sie haben eine einzelne Kaffeemaschine in einem Café. Immer wenn ein Kunde einen Kaffee bestellt, verwendet der Barista diese gleiche Kaffeemaschine, um jede Tasse zuzubereiten. Die Kaffeemaschine ist immer dieselbe, es wird nicht für jede Bestellung eine neue verwendet.
Ähnlich verhält es sich in Spring: Wenn Sie einen Bean aus dem Spring-Kontext injizieren, stellt Spring jedes Mal dieselbe Instanz dieses Beans bereit. Dies wird als Singleton-Scope bezeichnet. Genau wie die Kaffeemaschine im Café sorgt Spring dafür, dass Sie immer dasselbe Objekt erhalten, anstatt jedes Mal ein neues zu erstellen.
Singleton
Der Typ kann mit der Annotation @Scope festgelegt werden, wobei singleton in den Attributen angegeben wird.
SingletonService.
12345@Service @Scope("singleton") public class SingletonService { // Class for handling business logic }
Prototyp
PrototypeService.java
12345@Service @Scope("prototype") public class PrototypeService { // Class for handling business logic }
Wir führen denselben Vorgang aus, geben jedoch prototype in den Attributen an. Dadurch wird sichergestellt, dass jedes Mal, wenn wir diese Bean injizieren, ein neues Objekt zurückgegeben wird.
Zusammenfassung
In diesem Kapitel über IoC (Inversion of Control) und DI (Dependency Injection) wurde erläutert, wie Spring die Erstellung und den Lebenszyklus von Beans durch seinen Container verwaltet und so eine automatische Abhängigkeitsinjektion ermöglicht.
Es wurden der Standard-Scope singleton, bei dem eine einzelne Instanz einer Bean wiederverwendet wird, sowie der Scope prototype, der für jede Anfrage eine neue Instanz erstellt, behandelt. Dabei wurde hervorgehoben, wie diese Scopes das Objektmanagement und das Anwendungsdesign beeinflussen.
1. Was ist Inversion of Control (IoC) in Spring?
2. Welches Prinzip liegt der Dependency Injection (DI) zugrunde?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
What are some practical examples of using different bean scopes in a real application?
Can you explain the difference between @Component, @Service, @Repository, and @Controller in more detail?
How does Spring handle dependency injection with multiple constructors?
Awesome!
Completion rate improved to 3.45
IoC und DI
Swipe um das Menü anzuzeigen
Der Spring Container ist die zentrale Komponente des Spring Frameworks, die die Erstellung, Konfiguration und den Lebenszyklus von Beans (Objekten) innerhalb einer Anwendung verwaltet. Der Spring Container wird auch als IoC-Container bezeichnet.
Eine Abhängigkeit bezeichnet jede Klasse, die andere Objekte benötigt, um ordnungsgemäß zu funktionieren, wobei diese Kette von Abhängigkeiten theoretisch unendlich fortgesetzt werden kann. Normalerweise müssen wir, um ein Objekt mit Abhängigkeiten zu erstellen, dieses explizit mit dem new-Operator initialisieren und die Klasse angeben.
Genau hier greift Spring mit Inversion of Control und Dependency Injection ein. Die Idee ist, dass Spring die Verantwortung für die Erstellung und Verwaltung von Abhängigkeiten übernimmt. Anstatt die Einrichtung manuell vorzunehmen, annotieren wir einfach die benötigten Klassen, und Spring erstellt diese automatisch und verwaltet ihren Lebenszyklus innerhalb seines Kontexts.
Eine dieser Annotationen ist @Component, die wir oberhalb der Klasse platzieren.
BeanExample.java
123@Component public class BeanExample { }
Dieser Ansatz verlagert den Fokus weg von der manuellen Verwaltung von Abhängigkeiten, sodass sich Entwickler auf die Geschäftslogik konzentrieren können, während Spring die Infrastrukturaufgaben im Zusammenhang mit Objekterstellung und Abhängigkeitsverwaltung übernimmt.
Wie funktioniert der Spring-Container?
Beim Start der Anwendung wird der Spring Container initialisiert. Er beginnt damit, die Klassen nach Annotationen wie @Component, @Service, @Repository und @Configuration zu durchsuchen.
@Component ist eine allgemeine Annotation, die eine Klasse von Spring verwalten lässt, sodass sie als Bean registriert werden kann.
@Service, @Repository und @Controller sind spezialisierte Varianten von @Component. Sie erfüllen denselben Zweck, kennzeichnen jedoch die spezifische Rolle der Klasse: @Service für Geschäftslogik, @Repository für Datenzugriff und @Controller für Bearbeitung von Webanfragen.
@Configuration wird für Klassen verwendet, die Bean-Definitionen und Konfigurationen der Anwendung enthalten.
Durch das Markieren einer Klasse mit einer dieser Annotationen wird sichergestellt, dass sie als Bean im Spring-Kontext verfügbar ist.
Sobald die Klassen identifiziert wurden, erstellt der Container Instanzen dieser annotierten Klassen und wandelt sie damit in Beans um, die vom Spring-Kontext während des gesamten Lebenszyklus der Anwendung verwaltet werden.
Während diese Beans erstellt werden, übernimmt der Container automatisch deren Abhängigkeiten durch Dependency Injection. Dieser Prozess ermöglicht es Klassen, die notwendigen Abhängigkeiten zu erhalten, ohne sie explizit erstellen oder finden zu müssen, was den Entwicklungsprozess vereinfacht.
Dependency Injection (DI)
Zunächst fügt der Spring Container seinem Kontext die Beans (Klassen) hinzu, die mit den Annotationen @Component, @Service, @Repository und @Configuration gekennzeichnet sind. Anschließend stellt er diese Beans allen Objekten zur Verfügung, die sie anfordern.
Praxisbeispiel
Stellen Sie sich vor, Sie entwickeln einen Online-Shop. Sie haben eine Klasse OrderService, die Bestellungen verwaltet, und eine Klasse PaymentService, die Zahlungen abwickelt. Anstatt eine Instanz von PaymentService manuell innerhalb von OrderService zu erstellen, kann der Spring Container die Instanz von PaymentService erzeugen und in OrderService einfügen.
OrderService.java
PaymentService.java
1234567891011121314@Service public class OrderService { private final PaymentService paymentService; public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
In der Klasse OrderService befindet sich ein Feld paymentService, das mit dem genau benötigten Typ (PaymentService) initialisiert wird. Beachten Sie, dass dieses Objekt nicht explizit von uns initialisiert wurde, sondern Spring dies für uns übernommen hat!
Wäre PaymentService nicht mit @Service annotiert worden, wäre dieser Bean nicht zum Spring-Kontext hinzugefügt worden und es wäre ein Fehler aufgetreten, der darauf hinweist, dass Spring keinen solchen Bean finden konnte.
@Autowired
Die Annotation @Autowired kann ebenfalls verwendet werden. Sie weist den Spring Container an, das passende Objekt in das entsprechende Feld zu injektieren.
OrderService.java
123456789101112131415@Service public class OrderService { private final PaymentService paymentService; @Autowired public OrderService(PaymentService paymentService) { this.paymentService = paymentService; } public void placeOrder() { System.out.println("Placing order..."); paymentService.processPayment(); } }
In Spring ist ab Version 4.3 die Verwendung der @Autowired-Annotation beim Injizieren von Abhängigkeiten über einen Konstruktor nicht mehr erforderlich, sofern es nur einen Konstruktor in der Klasse gibt. Spring erkennt automatisch, dass dieser Konstruktor für die Abhängigkeitsinjektion verwendet werden soll.
Welche verschiedenen Typen von Beans gibt es?
Stellen Sie sich vor, Sie haben eine einzelne Kaffeemaschine in einem Café. Immer wenn ein Kunde einen Kaffee bestellt, verwendet der Barista diese gleiche Kaffeemaschine, um jede Tasse zuzubereiten. Die Kaffeemaschine ist immer dieselbe, es wird nicht für jede Bestellung eine neue verwendet.
Ähnlich verhält es sich in Spring: Wenn Sie einen Bean aus dem Spring-Kontext injizieren, stellt Spring jedes Mal dieselbe Instanz dieses Beans bereit. Dies wird als Singleton-Scope bezeichnet. Genau wie die Kaffeemaschine im Café sorgt Spring dafür, dass Sie immer dasselbe Objekt erhalten, anstatt jedes Mal ein neues zu erstellen.
Singleton
Der Typ kann mit der Annotation @Scope festgelegt werden, wobei singleton in den Attributen angegeben wird.
SingletonService.
12345@Service @Scope("singleton") public class SingletonService { // Class for handling business logic }
Prototyp
PrototypeService.java
12345@Service @Scope("prototype") public class PrototypeService { // Class for handling business logic }
Wir führen denselben Vorgang aus, geben jedoch prototype in den Attributen an. Dadurch wird sichergestellt, dass jedes Mal, wenn wir diese Bean injizieren, ein neues Objekt zurückgegeben wird.
Zusammenfassung
In diesem Kapitel über IoC (Inversion of Control) und DI (Dependency Injection) wurde erläutert, wie Spring die Erstellung und den Lebenszyklus von Beans durch seinen Container verwaltet und so eine automatische Abhängigkeitsinjektion ermöglicht.
Es wurden der Standard-Scope singleton, bei dem eine einzelne Instanz einer Bean wiederverwendet wird, sowie der Scope prototype, der für jede Anfrage eine neue Instanz erstellt, behandelt. Dabei wurde hervorgehoben, wie diese Scopes das Objektmanagement und das Anwendungsdesign beeinflussen.
1. Was ist Inversion of Control (IoC) in Spring?
2. Welches Prinzip liegt der Dependency Injection (DI) zugrunde?
Danke für Ihr Feedback!