Einführung in Spring Beans

Einführung in Spring Beans

24. Februar 2022

Heute dachte ich daran, über Spring MVC zu sprechen. Bevor wir jedoch in das MVC-Konzept einsteigen, möchte ich einige grundlegende Kenntnisse über Spring erläutern, die für das Verständnis des MVC unerlässlich sind.

Was ist ein Spring Bean?

Ein Spring Bean bezeichnet ein Objekt, das vom Spring Container verwaltet wird. Aber halt, was bedeutet das genau? Ein Objekt, das von Spring verwaltet wird? Handelt es sich hierbei um ein Objekt, das in der Bibliothek von Spring definiert ist?

Um die Frage zu beantworten: Nein, nicht unbedingt. Zwar kann es Objekte geben, die in der Bibliothek als Bean definiert sind, doch bezieht sich der Begriff Bean auf Objekte, die vom Benutzer erstellt, aber von Spring verwaltet werden. Ursprünglich musste der Benutzer Objekte selbst verwalten, aber beim Einsatz von Rahmenwerken spricht man von “Inversion of Control” (IOC).

Tipp

Viele, die lernen, glauben es vielleicht nicht, aber Spring erklärt sehr detailliert und genau seine eigenen Objekte und Beschreibungen. Man kann zwar die Dokumentation von Spring betrachten, aber oft sieht man direkt im Code die Bemühungen um verständliche Erklärungen. Schauen wir uns doch mal die von Spring definierten Objekte an:

image

Auf dem Bild oben sieht man die Schnittstelle der Bean-Annotation von Spring. Wenn man genau hinsieht, findet man viele Kommentare. Auf den ersten Blick mag das schwer verständlich sein, aber es ist erkennbar, dass man sich darum bemüht hat, die Materie verständlich zu machen. Lassen Sie uns sehen, wie sie ganz oben beschrieben wird.

image

„Die Methode, die durch diese Annotation gekennzeichnet ist, wird vom Spring Container als Bean verwaltet.“

Nun sehen wir uns mal die Zusammenfassung der Kommentare weiter unten an.

image

„Die Methode, die mit diesem Kommentar versehen ist, verhält sich in XML von Spring Legacy ähnlich einem Objekt, das als definiert wurde.“ und bietet weitere Codebeispiele zur Illustration an.

Bean-Registrierung

@Bean
public MyBean myBean() {
    // instantiate and configure MyBean obj
    return obj;
}

Auf diese Weise kann man mit der @Bean-Annotation vor der myBean-Methode zeigen, dass sie als bean registriert wird.

Man erklärt auch, wie man einem Bean einen Alias gibt, indem man ihn als Parameter angibt. Es wird sogar gezeigt, dass ein einzelnes Bean mithilfe eines Arrays mehrere Aliase haben kann.

Alias für Bean setzen

@Bean({"b1", "b2"}) // bean verfügbar als 'b1' und 'b2', aber nicht 'myBean'
public MyBean myBean() {
    // instantiate and configure MyBean obj
    return obj;
}

Im obigen Code zeigt der Parameter {"b1", "b2"} der Bean-Annotation, dass das Bean unter den Aliasen b1 und b2 verwaltet wird.

Warum also Aliase setzen?

Der Hauptgrund für das Setzen von Aliasen besteht darin, Namenskonflikte zwischen Spring Beans zu vermeiden.

@Bean
@Profile("production")
@Scope("prototype")
public MyBean myBean() {
    // instantiate and configure MyBean obj
    return obj;
} 

Eigenschaften von Beans?

image

Der nächste Kommentar erklärt, dass zusätzlich zu Aliasen keine weiteren Eigenschaften für Beans bereitgestellt werden. Zum Beispiel bietet es Eigenschaften wie Scope, Lazy, DependsOn, Primary nicht direkt an und erklärt, dass diese zusammen mit Annotationen wie @Scope, @Lazy, @DependsOn, @Primary verwendet werden sollten. Da plötzlich mehrere Eigenschaften aufgetaucht sind, erklären wir sie kurz:

@Lazy

Es kann verschiedene Beans geben, aber manchmal kann ein Bean in einem anderen Bean verwendet werden.

image

Angenommen, es gibt ein Bean zur Speicherung von Schülerinformationen, und dieses hat ein weiteres Bean als Mitgliedsvariable für persönliche Daten. Wenn das Objekt gleichzeitig erstellt wird und die persönlichen Daten initialisiert werden, könnten andere leicht auf diese zugreifen.

Standardmäßig folgt jedes Bean der Eager-Politik, bei der Variablen gleichzeitig beim Erstellen initialisiert werden. Ein Bean, das mit der @Lazy-Annotation gekennzeichnet ist, wird jedoch nicht sofort initialisiert, sondern erst dann, wenn es von einem anderen Bean referenziert oder explizit im BeanFactory gesucht wird.

Bean Factory: Ein IOC-Container, der für die Erstellung von Beans und die Einstellung von Abhängigkeiten verantwortlich ist.

@Scope

Jetzt besprechen wir Scope. Die @Scope-Annotation legt den Rahmen eines Beans fest.

image

Auch hier bietet die Beschreibung Erklärungen. Wenn die @Scope-Annotation zusammen mit der @Component-Annotation verwendet wird, zeigt sie den Namen des Scopes an, der auf die Instanz der Klasse angewendet wird.

Da wir Component noch nicht behandelt haben, lassen wir das kurz beiseite. Wenn es als Method-Level-Annotation mit @Bean verwendet wird, zeigt es den Namen des Scopes an, das für die Instanz, die von der Methode zurückgegeben wird, verwendet werden soll.

Normalerweise wird bei Beans ein Singleton-Muster verwendet, das sicherstellt, dass nur ein einziges Objekt zurückgegeben wird. Mit der @Scope-Annotation kann dieser Rahmen geändert werden. Es gibt einen klaren Beitrag, der dies gut erklärt. Ich verlinke ihn hier:

singleton – Gibt ein einzelnes Bean pro IoC-Container zurück. prototype – Gibt bei jeder Anforderung ein neues Bean zurück. request – Gibt ein einzelnes Bean pro HTTP-Request zurück. session – Gibt ein einzelnes Bean pro HTTP-Session zurück. globalSession – Gibt ein einzelnes Bean für alle Sessions zurück.

http://ojc.asia/bbs/board.php?bo_table=LecSpring&wr_id=498

@DependsOn

„Akzeptiert Abhängigkeit“ ist die Bedeutung. Es besagt, dass ein Bean, das mit dieser Annotation versehen ist, erst erstellt wird, nachdem das Bean mit dem angegebenen value erstellt wurde. Zum Beispiel, @DependsOn(value="myBean") garantiert, dass das Bean erst nach myBean erstellt wird.

Auch beim Aufheben wird das Bean erst abgebaut, nachdem das abhängige myBean abgebaut wurde.

@Primary

Wenn component-scanning angenommen wird, wird das Bean, das mit dieser Annotation und @Bean gekennzeichnet ist, zuerst in der component scan reihenfolge injiziert.

In einem Blog weiter unten wird Component Scan sehr gut erklärt. Kurz gesagt, anstatt die in @Configuration angegebenen Klassen einzeln zu registrieren, registriert man sie alle auf einmal. Bei @Primary wird erklärt, dass es bei diesem Scan als erstes registriert wird.

Ein sehr detaillierter und gut gemachter Blog beschreibt dies ausführlich.

Component Scan: https://velog.io/@hyun-jii/%EC%8A%A4%ED%94%84%EB%A7%81-component-scan-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EB%8F%99%EC%9E%91-%EA%B3%BC%EC%A0%95

Zusammenfassend

  • Heute haben wir einiges über Spring Beans gelernt. Ich hoffe, ihr hattet Spaß beim Lernen!