745 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.

68voto

xpioneer Punkte 2415

Ich sehe eine Menge Antworten und fast überall wird es erwähnt @Component ist für die automatische Verdrahtung, bei der die Komponente gescannt wird, und @Bean es genau die erklärt, dass die Bohne anders verwendet werden soll. Lassen Sie mich zeigen, wie es anders geht.

  • @Bohne

Zunächst handelt es sich um eine Bemerkung auf Methodenebene. Zweitens verwenden Sie sie im Allgemeinen, um Beans in Java-Code zu konfigurieren (wenn Sie keine XML-Konfiguration verwenden) und sie dann von einer Klasse aus mit der ApplicationContext.getBean Methode. Beispiel:

@Configuration
class MyConfiguration{
    @Bean
    public User getUser() {
        return new User();
    }
}

class User{
}    

// Getting Bean 
User user = applicationContext.getBean("getUser");
  • @Komponente

Es ist der allgemeine Weg, eine Bean zu annotieren und nicht eine spezialisierte Bean. Es ist eine Annotation auf Klassenebene und wird verwendet, um den ganzen Konfigurationskram durch Java- oder Xml-Konfiguration zu vermeiden.

Das sieht dann etwa so aus.

@Component
class User {
}

// to get Bean
@Autowired
User user;

Das war's. Sie wurde nur eingeführt, um alle Konfigurationsschritte zur Instanziierung und Verwendung dieser Bean zu vermeiden.

41voto

elvis Punkte 860

Sie können verwenden @Bean um eine vorhandene Klasse eines Drittanbieters für Ihren Spring-Framework-Anwendungskontext verfügbar zu machen.

@Bean
public ViewResolver viewResolver() {

    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

    viewResolver.setPrefix("/WEB-INF/view/");
    viewResolver.setSuffix(".jsp");

    return viewResolver;
}

Durch die Verwendung des @Bean Annotation können Sie eine Klasse eines Drittanbieters verpacken (sie darf keine @Component und es darf nicht Spring verwenden), als Spring-Bean. Und dann, sobald sie mit @Bean ist es als Singleton-Objekt in Ihrem Spring-Framework-Anwendungskontext verfügbar. Sie können diese Bean nun einfach in Ihrer Anwendung mithilfe von Dependency Injection und @Autowired .

Denken Sie also an die @Bean Annotation ist ein Wrapper/Adapter für Klassen von Drittanbietern. Sie möchten die Klassen von Drittanbietern für den Anwendungskontext Ihres Spring-Frameworks verfügbar machen.

Durch die Verwendung von @Bean im obigen Code deklariere ich explizit eine einzelne Bohne, weil ich innerhalb der Methode das Objekt explizit mit der Methode new Stichwort. Ich rufe auch manuell Setter-Methoden der gegebenen Klasse auf. So kann ich den Wert des Präfixfeldes ändern. Diese manuelle Arbeit wird also als explizite Erstellung bezeichnet. Wenn ich das @Component für dieselbe Klasse, wird die im Spring-Container registrierte Bean einen Standardwert für das Präfixfeld haben.

Andererseits, wenn wir eine Klasse mit @Component müssen wir nicht mehr manuell die new Stichwort. Es wird automatisch von Spring behandelt.

26voto

Dai Niu Punkte 459

Sie haben zwei Möglichkeiten Die eine ist, eine Klasse mit einer Annotation zu erstellen @Component . Die andere Möglichkeit besteht darin, eine Methode zu erstellen und sie mit @Bean . Für jene Klassen, die Methoden mit @Bean sollte vermerkt werden mit @Configuration Sobald Sie Ihr Spring-Projekt ausführen, wird die Klasse mit einer @ComponentScan Annotation würde jede Klasse mit @Component und stellen die Instanz dieser Klasse im Ioc-Container wieder her. Eine weitere Sache, die die @ComponentScan würde, ist die Ausführung der Methoden mit @Bean und das zurückgegebene Objekt als Bean in den Ioc Container zurückgeben. Wenn Sie also entscheiden müssen, welche Art von Beans Sie in Abhängigkeit vom aktuellen Zustand erstellen wollen, müssen Sie @Bean . Sie können die Logik schreiben und das gewünschte Objekt zurückgeben. Eine weitere erwähnenswerte Sache ist der Name der Methode mit @Bean ist der Standardname der Bohne.

24voto

SomeGuy Punkte 458

Wenn Sie die @Component Tag ist es dasselbe wie ein POJO (Plain Old Java Object) mit einer Vanilla Bean-Deklarationsmethode (kommentiert mit @Bean ). Die folgenden Methoden 1 und 2 führen zum Beispiel zum gleichen Ergebnis.

Methode 1

@Component
public class SomeClass {

    private int number;

    public SomeClass(Integer theNumber){
        this.number = theNumber.intValue();
    }

    public int getNumber(){
        return this.number;
    }
}

mit einer Bohne für 'theNumber':

@Bean
Integer theNumber(){
    return new Integer(3456);
}

Methode 2

//Note: no @Component tag
public class SomeClass {

    private int number;

    public SomeClass(Integer theNumber){
        this.number = theNumber.intValue();
    }

    public int getNumber(){
        return this.number;
    }
}

mit den Bohnen für beide:

@Bean
Integer theNumber(){
    return new Integer(3456);
}

@Bean
SomeClass someClass(Integer theNumber){
    return new SomeClass(theNumber);
}

Mit Methode 2 können Sie Bean-Deklarationen zusammenhalten, sie ist etwas flexibler usw. Vielleicht möchten Sie sogar eine weitere Nicht-Vanilla SomeClass Bean wie die folgende hinzufügen:

@Bean
SomeClass strawberryClass(){
    return new SomeClass(new Integer(1));
}

20voto

AzarEJ Punkte 435

Unterschied zwischen Bean und Komponente:

Difference between Bean and Component

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