2016-06-30 6 views
0

Bitte gehen Sie die komplette Frage durch, bevor Sie das Duplikat markieren. Kann mehr in Kommentaren diskutierenBedingte Bohne in anderer Bohne mit Contructor-Einspritzung verdrahten

Ich habe folgenden Code, wo ServiceA von ServiceB abhängt. Und serviceB Implementierung bean bedingt

initialisiert wird
class ServiceA{ 
    ServiceB serviceB; 
    ServiceA(ServiceB serviceB){ 
     this.serviceB = serviceB; 
    } 
} 


@Configuration 
class AppConfig{ 
    @Conditional("some_condition_based_on_property") 
    @Bean 
    ServiceB serviceB1(){ 
    return new ServiceBImpl1(); 
    } 

    @Conditional("some_condition_based_on_property") 
    @Bean 
    ServiceB serviceB2(){ 
    return new ServiceBImpl2(); 
    } 

    @Bean 
    ServiceA serviceA(){ 
    //what should go here so that conditional bean is injected in ServiceA 
    } 

} 

Ich kann nicht automatisch erkennen ServiceA Bohne, wie ich es in einer Karte mit einem gewissen Schlüssel injizieren müssen. Eine Option, die ich sehe, ist, Bau Injektion zu entfernen, und habe serviceB bean @autowired in ServiceA, die letzte Option für mich wäre. Irgendeine andere Wahl?

Edit: Ich möchte nicht, wenn sonst während der Injektion, wie die Bohnen an verschiedenen Orten definiert werden können. Ich werde nur @Conditional

+0

Mögliche Duplikate von http://stackoverflow.com/questions/19225115/how-to-do-conditional-auto-wiring-in-spring? – aksappy

+0

können Sie http://stackoverflow.com/questions/19225115/how-to-do-conditional-auto-wiring-in-spring überprüfen –

+0

Die Frage aktualisiert. Die damit verbundene Frage löst mein spezifisches Problem nicht – sidgate

Antwort

1

Nichts werden unter Verwendung hält Sie von autowiring die resultierende ServiceB direkt in der Konfigurationsklasse und Wiederverwendung der Referenz es für die Erstellung von ServiceA:

@Configuration 
class AppConfig{ 
    @Conditional(/* some condition */) 
    @Bean 
    ServiceB serviceB1(){ 
    return new ServiceBImpl1(); 
    } 

    @Conditional(/* some condition */) 
    @Bean 
    ServiceB serviceB2(){ 
    return new ServiceBImpl2(); 
    } 

    // store a local reference  
    @Autowired 
    private dynamicServiceB; 

    @Bean 
    ServiceA serviceA(){ 
    return new ServiceA(dynamicServiceB); 
    } 
} 

Allerdings fühlt es sich wie Sie versuchen zu arbeiten, um ein anderes Problem, das Sie nicht beschreiben, vor allem, wenn Sie syntaktisch falschen Code enthalten: @Conditional akzeptiert keine Zeichenfolgen als Werte. Sie sollten nicht erwarten, dass die Einschränkung akzeptabler Lösungen für diejenigen, die mit einem gebrochenen Bit Code arbeiten, viel Erfolg bringt.

Dies fühlt sich wie ein Szenario für eine @Profile.