731 Stimmen

Frühling: @Komponente versus @Bohne

Ich verstehe, dass @Component Annotation wurde in Spring 2.5 eingeführt, um die xml-Bean-Definition mit Hilfe von Classpath-Scanning loszuwerden.

@Bean wurde im Frühjahr 3.0 eingeführt und kann mit @Configuration um die xml-Datei vollständig loszuwerden und stattdessen Java Config zu verwenden.

Wäre es möglich gewesen, die @Component Anmerkung statt der Einführung von @Bean Bemerkung? Meines Erachtens besteht das Ziel in beiden Fällen darin, Beans zu erstellen.

699voto

MagGGG Punkte 16018

@Komponente Vorzugsweise für Bauteilabtastung und automatische Verdrahtung.

Wann sollten Sie die @Bohne ?

Manchmal ist eine automatische Konfiguration nicht möglich. Wann? Nehmen wir an, Sie wollen Komponenten aus Bibliotheken von Drittanbietern verdrahten (Sie haben den Quellcode nicht und können die Klassen nicht mit @Component annotieren), so dass eine automatische Konfiguration nicht möglich ist.

En @Bohne Anmerkung gibt ein Objekt zurück die spring als Bean im Anwendungskontext registrieren soll. Die Hauptteil der Methode trägt die Logik, die für die Erstellung der Instanz verantwortlich ist.

581voto

skaffman Punkte 389758

@Component y @Bean sind zwei völlig unterschiedliche Dinge, die nicht verwechselt werden sollten.

@Component (und @Service y @Repository ) werden zur automatischen Erkennung und Konfiguration von Beans mit Hilfe von Klassenpfad-Scans verwendet. Es gibt eine implizite Eins-zu-Eins-Zuordnung zwischen der annotierten Klasse und der Bean (d. h. eine Bean pro Klasse). Die Kontrolle der Verdrahtung ist bei diesem Ansatz recht begrenzt, da er rein deklarativ ist.

@Bean wird verwendet, um ausdrücklich eine einzelne Bean deklarieren, anstatt dies wie oben beschrieben automatisch von Spring erledigen zu lassen. Dadurch wird die Deklaration der Bean von der Klassendefinition entkoppelt, und Sie können Beans genau so erstellen und konfigurieren, wie Sie es wünschen.

Um Ihre Frage zu beantworten...

wäre es möglich gewesen, die @Component Anmerkung statt der Einführung von @Bean Bemerkung?

Sicher, wahrscheinlich, aber sie haben sich dagegen entschieden, da die beiden sehr unterschiedlich sind. Der Frühling ist schon verwirrend genug, ohne das Wasser noch mehr zu verwirren.

270voto

Saurabh Prakash Punkte 2495
  1. @Komponente Automatische Erkennung und konfiguriert die Beans mittels Klassenpfad-Scanning, während @Bean deklariert ausdrücklich eine einzelne Bean, anstatt dies automatisch von Spring erledigen zu lassen.
  2. @Komponente entkoppelt nicht die Deklaration der Bean aus der Klassendefinition, während @Bean entkoppelt die Deklaration der Bean aus der Klassendefinition.
  3. @Komponente ist eine Anmerkung auf Klassenebene während @Bean eine Anmerkung auf Methodenebene und der Name der Methode dient als Bean-Name.
  4. @Komponente müssen nicht mit der @Konfiguration verwendet werden Anmerkung, während die @Bean-Annotation wie folgt lauten muss innerhalb der Klasse verwendet, die mit @Configuration annotiert ist .
  5. Wir kann keine Bohne erstellen einer Klasse mit @Component, wenn die Klasse außerhalb des Spring-Containers liegt, während wir kann eine Bohne erstellen einer Klasse mit @Bean, auch wenn die Klasse vorhanden ist außerhalb des Federbehälters .
  6. @Komponente hat verschiedene Fachrichtungen wie @Controller, @Repository und @Service, während @Bean keine Spezialisierungen .

239voto

outdev Punkte 4886

Nehmen wir an, ich möchte eine spezifische Implementierung in Abhängigkeit von einem dynamischen Zustand. @Bean ist perfekt für diesen Fall.

@Bean
@Scope("prototype")
public SomeService someService() {
    switch (state) {
    case 1:
        return new Impl1();
    case 2:
        return new Impl2();
    case 3:
        return new Impl3();
    default:
        return new Impl();
    }
}

Es gibt jedoch keine Möglichkeit, dies zu tun mit @Component .

120voto

Oiew Punkte 1489

Beide Ansätze zielen darauf ab, den Zieltyp im Spring-Container zu registrieren.

Der Unterschied besteht darin, dass @Bean ist anwendbar auf Methoden in der Erwägung, dass @Component ist anwendbar auf Typen .

Wenn Sie also @Bean Annotation steuern Sie die Logik der Instanzerstellung im Methodenrumpf (siehe obiges Beispiel ). Mit @Component Bemerkung können Sie nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X