2017-02-09 5 views
1

Ich habe einen Java-Config wo ServiceB auf ServiceA abhängt:Wie eine Feder Bohne in einer Bean-definierende Methode, um

@Bean 
ServiceA getServiceA() { return new ServiceA(); } 
@Bean 
ServiceB getServiceB() { return new ServiceB(getServiceA()); } 

Dann will ich ServiceA (aber keine ServiceB) als Komponente erklären. Ich füge @ScanPackage ServiceA config und mit Anmerkungen versehen:

Wie Methode erklären getServiceB() jetzt?

Antwort

2

Wie Rohan bereits in seiner answer schrieb, kann die Spring-@Bean-Annotation Abhängigkeiten von anderen Spring-Beans auf dieselbe Weise einspeisen wie die auf Konstruktoren basierende Abhängigkeitsinjektion.

Ich würde nur hinzufügen, dass es auch andere Möglichkeiten gibt, Abhängigkeitsinjektion durchzuführen, wenn ein Bean in Java-Konfiguration definiert wird. @Configuration kommentierte Klasse ist ein Spring-Bean als jeder anderer Spring-Bean, so können Sie Auto-Draht eine Abhängigkeit, wie sie üblicherweise im Frühjahr durchgeführt wird und dann diese Abhängigkeit verwenden, wenn Ihre @Bean definieren, wie:

@Autowired 
private ServiceA serviceA; 

@Bean 
public ServiceB getServiceB() { 
    return new ServiceB(serviceA); 
} 

Seit Spring Framework 4.3, Sie sind auch in der Lage, Konstruktorinjektion in Klassen zu tun - das ist noch eine andere Möglichkeit, Abhängigkeiten zu injizieren.

Weitere Details in spring documentation.

+0

Schnelle Korrektur: Ich schrieb die Antwort, die Sie verbunden haben, aber ich bin nicht das OP, wie Ihre Antwort zu sehen scheint :) –

+0

@RohanPrabhu, Sie haben Recht. :) Sie haben die Frage bearbeitet und ich war nicht vorsichtig genug, um zu bemerken, dass Sie nicht das OP sind. Ich habe meine Antwort korrigiert und deine verbessert. –

3

Frühling Auto-einspritzt Methode Parameter nach Typ zur Definition von Methoden Bean:

@Bean 
ServiceB getServiceB(ServiceA serviceA) { 
    return new ServiceB(serviceA); 
} 

Jetzt über Sie müssen sich keine Sorgen, wie ServiceA vorgesehen ist.

+0

Was passiert, wenn 'ServiceB' von' ServiceC' und 'ServiceD' verwendet wird? Soll ich allen Methodendeklarationen den Parameter 'ServiceA serviceA' hinzufügen? – awfun

+0

Sobald 'ServiceB' als Bean definiert ist, können Sie dies einfach in einem Methodenparameter verwenden. '@Bean ServiceC getServiceC (ServiceB-ServiceB) {neuer ServiceC (ServiceB); } '. Dies ist auch der richtige Weg, um es zu tun, weil Sie die gleiche Instanz der Bean verwenden würden (außer Sie verwenden einen Prototyp Bereich), und auch nicht den Code für die Erstellung von 'ServiceB' Duplizieren –

Verwandte Themen