2017-09-12 8 views
0

Ich habe eine Klasse verwendet, die ich mit @Service @Scope@ Service/@-Controller Anmerkungen erstellt eine neue Bean ohne @Bean Anmerkung

@Slf4j 
@Service 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class ProductDataModel { 
@Value("${message}") 
private String message; 

Der obige Code scheint ProductDataModel kommentiert haben für eine Bohne zu erstellen, ohne die @Bean Annotation zu verwenden.

Ich verwende @Autowired ProductDataModel productDataModel in meinem Code, und die Abhängigkeit productDataModel ist nicht null, wenn mit oben genannten Stück Code verwendet.

Wie kommt es, dass der oben genannte Code Bean erstellt ??

Idealerweise würde ich nur dann zu erwarten Bean erstellt haben, wenn ich den Code unten verwenden

//I am not using this piece of code in my program., for reference only 

@Configuration 
public class OSCConfig { 

@Bean 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
ProductDataModel productDataModel(){ 
return new ProductDataModel(); 
} 

Kann jemand den Unterschied zwischen zwei Teile des Codes erklären und wann die man verwenden.

+0

Es ist Komponente gescannt. Sie müssen keine '@ Bean' für jede Klasse/Bean angeben, die Sie verwenden möchten. Wenn Sie '@ Component' oder eine der spezialisierten Versionen wie' @ Service' auf eine Klasse setzen, wird diese automatisch beim Scannen von Komponenten erkannt. –

+0

Wenn das der Fall ist, sollte @Bean nur verwendet werden, wenn wir Beans mit Konstruktor deklarieren oder die Lebenszyklus-Callback-Methoden wie init, cleanup etc. angeben. – Abhi

+0

Nein, nicht wirklich, Sie können all diese Dinge ohne '@Bean machen '... –

Antwort

0

Die @Service-Annotation wird von Spring erkannt, wenn nach Objekten gesucht wird, die erstellt werden sollen (als Teil eines Paket-Scans). Es ist eine Spezialisierung der Spring @ Component Annotation, fügt aber nicht viel mehr hinzu, als den Benutzern einen Hinweis auf ihren beabsichtigten Zweck zu geben. Die Annotation @Controller ist ähnlich, aber die erstellte Bean hat bestimmte Eigenschaften. Die @Bean-Annotation, wie Sie sie verwendet haben, wird auch beim Erstellen von Objekten verwendet, und in diesem Kontext gehört sie zu einer Methode in einer Configuration-Klasse. Daher hat die erstellte Bean den von der Methode zurückgegebenen Typ.

+0

Vielen Dank für Ihre Antwort, aber das ist meine Frage @Service + @ Scope erstellt eine neue Bean-Instanz ohne Verwendung von @ Bean .. Ich habe meine Frage zum besseren Verständnis bearbeitet. – Abhi

0

Wie @M. Deinum wies darauf hin, dass @Bean nicht für jede Klasse angegeben werden muss, wenn @Service oder @Controller Annotation von Spring Container erkannt werden, wenn das Scannen von Komponenten für dieses Paket aktiviert ist.

So gut Anwendungsfall für die Verwendung von @Bean könnte sein, dass

  • Wenn die Klasse in Dritten Glas ist und man kann nicht @ Service/@-Controller Anmerkungen
  • hinzufügen Wenn Sie einige benutzerdefinierte hinzufügen möchten Logik innerhalb der @Bean Annotate Methoden
Verwandte Themen