Ich verstehe, dass die @Component
Annotation im Frühjahr 2.5 eingeführt wurde, um die XML-Bean-Definition mithilfe des Klassenpfad-Scannens zu entfernen.
@Bean
wurde im Frühjahr 3.0 eingeführt und kann verwendet @Configuration
werden, um die XML-Datei vollständig zu entfernen und stattdessen die Java-Konfiguration zu verwenden.
Wäre es möglich gewesen, die @Component
Anmerkung wiederzuverwenden, anstatt eine @Bean
Anmerkung einzuführen ? Mein Verständnis ist, dass das Endziel in beiden Fällen darin besteht, Bohnen zu erzeugen.
java
spring
annotations
autowired
user1396576
quelle
quelle
@Component
,@Repository
und@Service
Anmerkungen im Frühjahr?Lite mode
. Und es wird nicht empfohlen. Siehe hier: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
einer anpassbaren Instanz von Spring Bean zurückgibt, während@component
eine Klasse definiert wird, die später bei Bedarf von der Spring IoC-Engine instanziiert werden kann.Antworten:
@Component
und@Bean
mache zwei ganz verschiedene Dinge und sollte nicht verwechselt werden.@Component
(und@Service
und@Repository
) werden verwendet, um Beans mithilfe des Klassenpfad-Scans automatisch zu erkennen und zu konfigurieren. Es gibt eine implizite Eins-zu-Eins-Zuordnung zwischen der mit Anmerkungen versehenen Klasse und der Bean (dh einer Bean pro Klasse). Die Steuerung der Verkabelung ist bei diesem Ansatz sehr begrenzt, da er rein deklarativ ist.@Bean
wird verwendet , um eine einzelne Bean explizit zu deklarieren, anstatt Spring dies wie oben automatisch tun zu lassen. Es entkoppelt die Deklaration der Bean von der Klassendefinition und ermöglicht es Ihnen, Beans genau nach Ihren Wünschen zu erstellen und zu konfigurieren.Zur Beantwortung Ihrer Frage...
Sicher wahrscheinlich; aber sie entschieden sich dagegen, da die beiden sehr unterschiedlich sind. Der Frühling ist schon verwirrend genug, ohne das Wasser weiter zu trüben.
quelle
@Component
wenn Autowired benötigt wird? Es scheint@Bean
nicht zu beeinflussen@Autowired
@Autowired
mit@Bean
kommentiert haben@Configuration
@Komponente Bevorzugt für das Scannen von Komponenten und die automatische Verkabelung.
Wann sollten Sie @Bean verwenden ?
Manchmal ist eine automatische Konfiguration keine Option. Wann?Stellen Sie sich vor, Sie möchten Komponenten aus Bibliotheken von Drittanbietern verkabeln (Sie haben keinen Quellcode, sodass Sie die Klassen nicht mit @Component kommentieren können), sodass eine automatische Konfiguration nicht möglich ist.
Die Annotation @Bean gibt ein Objekt zurück , das spring im Anwendungskontext als Bean registrieren soll. Der Hauptteil der Methode trägt die Logik, die für die Erstellung der Instanz verantwortlich ist.
quelle
@Component
geht es um Klassen selbst, während es@Bean
um Klassenmethoden geht (die Instanzen von Klassenobjekten ergeben).Nehmen wir an, ich möchte eine spezifische Implementierung in Abhängigkeit von einem dynamischen Zustand.
@Bean
ist perfekt für diesen Fall.Es gibt jedoch keine Möglichkeit, dies zu tun
@Component
.quelle
@Configuration
quelle
Beide Ansätze zielen darauf ab, den Zieltyp im Spring-Container zu registrieren.
Der Unterschied besteht darin, dass dies
@Bean
für Methoden gilt , während dies@Component
für Typen gilt .Wenn Sie also
@Bean
Anmerkungen verwenden, steuern Sie die Instanzerstellungslogik im Hauptteil der Methode (siehe Beispiel oben ). Mit@Component
Annotation können Sie nicht.quelle
Ich sehe viele Antworten und fast überall ist die erwähnte @Component für das automatische Verdrahten gedacht, wo die Komponente gescannt wird und @Bean genau erklärt, dass die Bean anders verwendet werden soll. Lassen Sie mich zeigen, wie es anders ist.
Zuerst ist es eine Annotation auf Methodenebene. Zweitens verwenden Sie im Allgemeinen die Konfiguration von Beans in einem Java-Code (wenn Sie keine XML-Konfiguration verwenden) und rufen sie dann mit der getBean-Methode von ApplicationContext aus einer Klasse auf. mögen
Es ist eine allgemeine Methode, eine Bohne und keine spezialisierte Bohne mit Anmerkungen zu versehen. Eine Annotation auf Klassenebene, die verwendet wird, um all das Konfigurationsmaterial durch Java- oder XML-Konfiguration zu vermeiden.
Wir bekommen so etwas.
Das ist es . Es wurde nur eingeführt, um alle Konfigurationsschritte zum Instanziieren und Verwenden dieser Bean zu vermeiden.
quelle
@Bean
Ansatz verwenden. Sie können@Autowire
die Bohne weiterhin verwenden , wie Sie es im Fall von tun würden@Component
.@Bean
Fügt die Bohne einfach wie gewohnt zum Frühlingsbehälter hinzu@Component
. Der Unterschied ist wie folgt. 1. Mit@Bean
können Sie Spring Container Klassen von Drittanbietern hinzufügen. 2. Mit@Bean
können Sie die gewünschte Implementierung einer Schnittstelle zur Laufzeit erhalten (unter Verwendung des Factory-Design-Musters)Sie können verwenden
@Bean
, um eine vorhandene Klasse eines Drittanbieters für Ihren Spring Framework-Anwendungskontext verfügbar zu machen.Mithilfe der
@Bean
Anmerkung können Sie eine Klasse eines Drittanbieters (die möglicherweise nicht über@Component
Spring verfügt und Spring nicht verwendet) als Spring Bean einbinden. Sobald es mit verpackt ist,@Bean
ist es ein Singleton-Objekt und in Ihrem Spring Framework-Anwendungskontext verfügbar. Sie können diese Bean jetzt mithilfe der Abhängigkeitsinjektion und einfach in Ihrer App freigeben / wiederverwenden@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 Ihren Spring Framework-Anwendungskontext verfügbar machen.Mit
@Bean
dem obigen Code deklariere ich explizit eine einzelne Bean, da ich innerhalb der Methode das Objekt explizit mit demnew
Schlüsselwort erstelle . Ich rufe auch manuell Setter-Methoden der angegebenen Klasse auf. So kann ich den Wert des Präfixfeldes ändern. Daher wird diese manuelle Arbeit als explizite Erstellung bezeichnet. Wenn ich das benutze@Component
für dieselbe Klasse verwende, hat die im Spring-Container registrierte Bean den Standardwert für das Präfixfeld.Wenn wir dagegen eine Klasse mit Anmerkungen versehen
@Component
, müssen wir dasnew
Schlüsselwort nicht manuell verwenden . Es wird automatisch von Spring behandelt.quelle
Wenn Sie das
@Component
Tag verwenden, entspricht dies einem POJO (Plain Old Java Object) mit einer Vanillebohnen-Deklarationsmethode (mit Anmerkungen versehen@Bean
). Beispielsweise ergeben die folgenden Methoden 1 und 2 das gleiche Ergebnis.Methode 1
mit einer Bohne für 'theNumber':
Methode 2
mit den Bohnen für beide:
Mit Methode 2 können Sie Bean-Deklarationen zusammenhalten, sie sind etwas flexibler usw. Möglicherweise möchten Sie sogar eine andere SomeClass-Bean ohne Vanille wie die folgende hinzufügen:
quelle
Sie haben zwei Möglichkeiten, Bohnen zu generieren. Eine besteht darin, eine Klasse mit einer Anmerkung zu erstellen
@Component
. Die andere besteht darin, eine Methode zu erstellen und mit Anmerkungen zu versehen@Bean
. Für Klassen, die Methoden mit enthalten,@Bean
sollte eine Annotation mit vorhanden sein.@Configuration
Sobald Sie Ihr Spring-Projekt ausgeführt haben,@ComponentScan
scannt die Klasse mit einer Annotation jede Klasse mit@Component
dieser Annotation und stellt die Instanz dieser Klasse im Ioc-Container wieder her. Eine andere Sache, die Sie@ComponentScan
tun würden, ist, die Methoden mit@Bean
darauf auszuführen und das Rückgabeobjekt als Bean im Ioc-Container wiederherzustellen. Wenn Sie also entscheiden müssen, welche Art von Bohnen Sie abhängig vom aktuellen Status erstellen möchten, müssen Sie diese verwenden@Bean
. Sie können die Logik schreiben und das gewünschte Objekt zurückgeben. Eine andere erwähnenswerte Sache ist der Name der Methode, wobei@Bean
der Standardname der Bean ist.quelle
quelle
@Bean wurde erstellt, um zu vermeiden, dass Spring und Ihre Geschäftsregeln in der Kompilierungszeit gekoppelt werden. Dies bedeutet, dass Sie Ihre Geschäftsregeln in anderen Frameworks wie PlayFramework oder JEE wiederverwenden können.
Darüber hinaus haben Sie die vollständige Kontrolle darüber, wie Beans erstellt werden, wobei die Standard-Spring-Instanzation nicht ausreicht.
Ich habe einen Beitrag darüber geschrieben.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
quelle
Unterschied zwischen Bean und Komponente:
quelle
1. Über @Component
@Component funktioniert ähnlich wie @Configuration.
Beide geben an, dass für die mit Anmerkungen versehene Klasse eine oder mehrere Beans registriert werden müssen
Spring-IOC-Container
.Die von @Component annotierte Klasse nennen wir sie
Component of Spring
. Es ist ein Konzept, das mehrere Bohnen enthält.Component class
muss von Spring automatisch gescannt werden, um die Bohnen der zu registrierencomponent class
.2. Über @Bean
@Bean wird verwendet, um die Methode von
component-class
(wie oben erwähnt) zu kommentieren . Es zeigt an, dass die Instanz, die durch die mit Anmerkungen versehene Methode wiederhergestellt wurde, registriert werden mussSpring-IOC-Container
.3. Fazit
Der Unterschied zwischen den beiden ist relativ offensichtlich, sie werden in verwendet
different circumstances
. Die allgemeine Verwendung ist:quelle
Zusätzliche Punkte aus den obigen Antworten
Angenommen, wir haben ein Modul, das in mehreren Apps gemeinsam genutzt wird und einige Dienste enthält. Nicht alle werden für jede App benötigt.
Wenn Sie @Component für diese Serviceklassen und den Komponentenscan in der Anwendung verwenden,
In diesem Fall mussten Sie entweder die Filterung des Komponentenscans anpassen oder die Konfiguration bereitstellen, die auch die nicht verwendeten Beans ausführen können. Andernfalls wird der Anwendungskontext nicht gestartet.
In diesem Fall ist es besser, mit der @ Bean-Annotation zu arbeiten und nur diese Beans zu instanziieren.
Verwenden Sie also im Wesentlichen @Bean, um dem Kontext Klassen von Drittanbietern hinzuzufügen. Und @Component, wenn es sich nur in Ihrer einzelnen Anwendung befindet.
quelle