2015-04-24 11 views
22

Ich habe eine Frage zu Spring Annotation-Konfigurationen. Ich habe eine Bohne:Bedingte Frühlingsbohnen-Erstellung

@Bean 
public ObservationWebSocketClient observationWebSocketClient(){ 
    log.info("creating web socket connection..."); 
    return new ObservationWebSocketClient(); 
} 

und ich habe eine Eigenschaftsdatei:

@Autowired 
Environment env; 

In der Eigenschaftendatei ich eine spezielle boolean Eigenschaft

createWebsocket=true/false 

haben will, die, ob eine Bohne unterzeichnet ObservationWebSocketClient sollte erstellt werden. Wenn der Eigenschaftswert falsch ist, möchte ich überhaupt keine Web Socket Verbindung herstellen.

Gibt es eine technische Möglichkeit, dies zu realisieren?

+0

Haben Sie keine direkte Antwort auf Ihre Frage, aber ist vielleicht ein Federprofil für Sie geeignet? So wird die Bohne nur in dem Profil erstellt, in dem sie benötigt wird (z. B. Test, Entwicklung, Produktion ...) – DrunkenPope

Antwort

31

Obwohl ich diese Funktionalität nicht verwendet habe, scheint es, dass Sie dies mit Feder 4s @Conditional annotation tun können.

Erstellen Sie zunächst eine Condition Klasse, in dem der ConditionContext Zugang zum Environment hat:

public class MyCondition implements Condition { 
    @Override 
    public boolean matches(ConditionContext context, 
          AnnotatedTypeMetadata metadata) { 
     Environment env = context.getEnvironment(); 
     return null != env 
       && "true".equals(env.getProperty("createWebSocket")); 
    } 
} 

Dann Anmerkungen versehen Bohne:

@Bean 
@Conditional(MyCondition.class) 
public ObservationWebSocketClient observationWebSocketClient(){ 
    log.info("creating web socket connection..."); 
    return new ObservationWebSocketClient(); 
} 

bearbeiten Die spring-boot Anmerkung @ConditionalOnProperty diese umgesetzt hat generisch; der Quellcode für die Condition verwendet, um es is available on github here für interessierte zu bewerten. Wenn Sie diese Funktion häufig benötigen, ist es ratsam, eine ähnliche Implementierung zu verwenden, anstatt viele benutzerdefinierte Condition Implementierungen zu erstellen.

+0

@chrylis Was ist die bessere Lösung? Rückgabe von 'null' aus der' observationWebSocketClient' Methode? – beerbajay

+0

Posted (dauerte eine Weile auf Handy tippen). – chrylis

+0

Bitte werfen Sie einen Blick auf den folgenden Vorschlag zur Verwendung von ConditionalOnProperty. Das scheint effektiver zu sein. –

24

Kommentieren Sie Ihre Bean-Methode mit @ConditionalOnProperty("createWebSocket").

Beachten Sie, dass der Spring Boot eine Reihe nützlicher, vorverpackter Bedingungen bietet.

+4

Ist dieser "Spring-Boot" spezifisch? – beerbajay

+0

@beerbajay Ich glaube nicht, und wenn es ist, kann die Annotation enthalten sein, ohne die automatische Konfiguration zu aktivieren. Es ist im Wesentlichen sehr ähnlich zu Ihrem Vorschlag, außer generalisiert und vor-implementiert. – chrylis

+1

Hrmm, scheint nur "Spring-Boot" zu sein: [javadocs] (http://docs.spring.io/autorepo/docs/spring-boot/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty .html) – beerbajay

0

Was mich betrifft, kann dieses Problem durch mit Spring 3.1 @Profiles, gelöst werden, weil @Conditional Anmerkung Sie Gelegenheit geben, für einige Strategie für die bedingte Bean Registrierung (benutzerdefinierte Strategien für die bedingte Prüfung) zu definieren, wenn @Profiles können nur auf Logik basiert Environment nur Variablen.