Was ist eine Frühlingsbohne?

1. Übersicht

Bean ist ein Schlüsselkonzept des Spring Framework. Daher ist das Verständnis dieses Begriffs von entscheidender Bedeutung, um den Überblick über das Framework zu behalten und es effektiv zu nutzen.

Leider gibt es keine klaren Antworten auf eine einfache Frage - was eine Frühlingsbohne wirklich ist. Einige Erklärungen sind so niedrig, dass ein großes Bild übersehen wird, während andere zu vage sind.

In diesem Tutorial wird versucht, das Thema zu beleuchten, beginnend mit einer Beschreibung in der offiziellen Dokumentation.

2. Bean Definition

Hier ist eine Definition von Beans in der Spring Framework-Dokumentation:

In Spring werden die Objekte, die das Rückgrat Ihrer Anwendung bilden und vom Spring IoC-Container verwaltet werden, als Beans bezeichnet. Eine Bean ist ein Objekt, das von einem Spring IoC-Container instanziiert, zusammengestellt und anderweitig verwaltet wird.

Diese Definition ist prägnant und bringt es auf den Punkt, übersieht jedoch eine wichtige Sache - den Spring IoC-Container. Lassen Sie uns das Kaninchenloch hinuntergehen, um zu sehen, was es ist und welche Vorteile es bringt.

3. Umkehrung der Kontrolle

Einfach ausgedrückt ist Inversion of Control, kurz IoC, ein Prozess, bei dem ein Objekt seine Abhängigkeiten definiert, ohne sie zu erstellen. Dieses Objekt delegiert die Aufgabe zum Erstellen solcher Abhängigkeiten an einen IoC-Container.

Beginnen wir mit der Deklaration einiger Domänenklassen, bevor wir in IoC eintauchen.

3.1. Domänenklassen

Angenommen, wir haben eine Klassendeklaration:

public class Company { private Address address; public Company(Address address) { this.address = address; } // getter, setter and other properties }

Diese Klasse benötigt einen Mitarbeiter vom Typ Adresse :

public class Address { private String street; private int number; public Address(String street, int number) { this.street = street; this.number = number; } // getters and setters }

3.2. Traditioneller Ansatz

Normalerweise erstellen wir Objekte mit den Konstruktoren ihrer Klassen:

Address address = new Address("High Street", 1000); Company company = new Company(address);

An diesem Ansatz ist nichts auszusetzen, aber wäre es nicht schön, die Abhängigkeiten besser zu verwalten?

Stellen Sie sich eine Anwendung mit Dutzenden oder sogar Hunderten von Klassen vor. Manchmal möchten wir eine einzelne Instanz einer Klasse für die gesamte Anwendung freigeben, manchmal benötigen wir für jeden Anwendungsfall ein separates Objekt und so weiter.

Das Verwalten einer solchen Anzahl von Objekten ist ein wahrer Albtraum. Hier kommt Inversion of Control zur Rettung.

Anstatt Abhängigkeiten selbst zu erstellen, kann ein Objekt seine Abhängigkeiten aus einem IoC-Container abrufen. Wir müssen dem Container lediglich die entsprechenden Konfigurationsmetadaten zur Verfügung stellen.

3.3. Bean-Konfiguration

Lassen Sie uns zunächst die Company- Klasse mit der Annotation @Component dekorieren :

@Component public class Company { // this body is the same as before }

Hier ist eine Konfigurationsklasse, die einem IoC-Container Bean-Metadaten bereitstellt:

@Configuration @ComponentScan(basePackageClasses = Company.class) public class Config { @Bean public Address getAddress() { return new Address("High Street", 1000); } }

Die Konfigurationsklasse erzeugt eine Bean vom Typ Adresse . Es enthält auch die Annotation @ComponentScan , die den Container anweist , in dem Paket, das die Company- Klasse enthält, nach Beans zu suchen .

Wenn ein Spring IoC-Container Objekte dieser Art erstellt, werden alle Objekte als Spring Beans bezeichnet, da sie vom IoC-Container verwaltet werden.

3.4. IoC in Aktion

Da wir Beans in einer Konfigurationsklasse definiert haben, benötigen wir eine Instanz der AnnotationConfigApplicationContext- Klasse, um einen Container aufzubauen:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);

Ein schneller Test überprüft die Existenz sowie die Eigenschaftswerte unserer Bohnen:

Company company = context.getBean("company", Company.class); assertEquals("High Street", company.getAddress().getStreet()); assertEquals(1000, company.getAddress().getNumber());

Das Ergebnis zeigt, dass der IoC-Container Beans korrekt erstellt und initialisiert hat.

4. Fazit

Dieses Tutorial enthielt eine kurze Beschreibung der Spring Beans und ihrer Beziehung zu einem IoC-Container.

Den vollständigen Quellcode für dieses Tutorial finden Sie auf GitHub.