2016-05-25 3 views
1

Ich habe eine @Configuration annotierte Klasse, die @Bean annotierte Methoden hat. Die meisten von ihnen zurückkehren einfach neue Instanzen, die keine DI Abhängigkeiten z.B .:Wie von @Bean eine Bean zurückgegeben wird, die Abhängigkeiten zu anderen Beans hat

@Bean 
public UserService getUserService() { 
    return new InMemoryUserService(); 
} 

Aber einige der Bohnen benötigen Konstruktor Injektion, z.B.

@Bean 
public BookingService getBookingService() { 
    return new InMemoryBookingServiceImpl(???); // i need to inject UserService to constructor 
} 

Wie kann ich das tun?

+0

warum Sie Instanz InMemoryBookingServiceImpl explizit erstellen brauchen? Kann es als @Component kommentiert werden? –

+0

Wäre es nicht einfacher, die Bean zu erstellen, indem Sie die 'InMemoryBookingServiceImpl' Klasse mit' @ Component' annotieren, während Sie die Abhängigkeiten automatisch in die BeanInformation einfügen? –

+0

http://stackoverflow.com/questions/24014919/converting-spring-xml-file-to-spring-configuration-class –

Antwort

3

Übergeben Sie einfach die Bohnen, die Sie als Parameter für die Methode benötigen.

@Bean 
public UserService getUserService() { 
    return new InMemoryUserService(); 
} 

@Bean 
public BookingService getBookingService(UserService userServ) { 
    return new InMemoryBookingServiceImpl(userServ); 
} 

Hier wenn der Frühling zum getBookingService bekommt, wird es sehen, dass es eine Bohne vom Typ erfordert UserService und für einen im Rahmen aussehen wird.

Siehe docs

die Dependency Injection-Regeln gelten. Wenn keine Bean dieses Typs gefunden wird, wird eine Ausnahme ausgelöst, oder wenn mehr als eine Bean dieses Typs gefunden wird, müssen Sie @Qualifier verwenden, um einen Namen der gewünschten Bean anzugeben, oder eine der Beans mit @Primary

markieren

Eine weitere Option ist direkt mit dem die Methode zu verwenden, die die Abhängigkeit Bohne produziert:

@Bean 
public UserService getUserService() { 
    return new InMemoryUserService(); 
} 

@Bean 
public BookingService getBookingService() { 
    return new InMemoryBookingServiceImpl(getUserService()); 
} 
+2

nur ein Kommentar zur 2. Option (Aufruf der Methode). Spring hat einen starken Voodoo (Bytecode-Manipulation), wo es immer noch eine Instanz von 'UserService' erzeugt, auch wenn die Methode 'getUserService() 'mehrmals aufgerufen wird. – Augusto

Verwandte Themen