2015-04-24 11 views
22

Mam pytanie dotyczące konfiguracji adnotacji sprężynowych. Mam Fasola:Tworzenie warunkowego bobu sprężystego

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

i mam pliku właściwość:

@Autowired 
Environment env; 

w pliku własności chcę mieć specjalną właściwość logiczną

createWebsocket=true/false 

który podpisuje czy fasoli ObservationWebSocketClient powinien zostać utworzony. Jeśli wartość właściwości to false, nie chcę w ogóle ustanawiać połączenia z gniazdem sieciowym.

Czy istnieje jakaś techniczna możliwość zrealizowania tego?

+0

Nie masz bezpośredniej odpowiedzi na swoje pytanie, ale czy może jest odpowiedni dla Ciebie profil wiosenny? Więc ziarno powstaje tylko w profilu, w którym jest potrzebne (np. Test, rozwój, produkcja ...) – DrunkenPope

Odpowiedz

31

Chociaż nie korzystałem z tej funkcji, wydaje się, że można to zrobić z wiosną 4: @Conditional annotation.

Najpierw utwórz Condition klasę, w której ConditionContext ma dostęp do Environment:

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")); 
    } 
} 

Następnie opisywania Fasola:

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

zmieniłspring-boot adnotacja @ConditionalOnProperty wdrożyła tego ogólnie; kod źródłowy dla Condition używany do oceny is available on github here dla zainteresowanych. Jeśli często będziesz potrzebować tej funkcjonalności, zalecane będzie użycie podobnej implementacji niż tworzenie niestandardowych implementacji Condition.

+0

@chrylis Jakie jest lepsze rozwiązanie? Zwracanie 'null' z metody' observationWebSocketClient'? – beerbajay

+0

Opublikowany (trwało chwilę, aby pisać na telefonie komórkowym). – chrylis

+0

Proszę zapoznać się z poniższą propozycją użycia ConditionalOnProperty. Wydaje się, że jest to bardziej skuteczne. –

24

Opisz swoją metodę fasoli za pomocą @ConditionalOnProperty("createWebSocket").

Należy pamiętać, że Spring Boot oferuje wiele użytecznych warunków w opakowaniu.

+4

Czy to jest specyficzne dla wiosennego rozruchu? – beerbajay

+0

@beerbajay Nie wierzę, a jeśli tak jest, adnotacja może być zawarta bez włączania autokonfiguracji. Jest to zasadniczo bardzo podobne do twojej sugestii, z wyjątkiem uogólnionych i wcześniej wdrożonych. – chrylis

+1

Hrmm, wydaje się być tylko "wiosennym startem": [javadocs] (http://docs.spring.io/autorepo/docs/spring-boot/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty .html) – beerbajay

0

Jak dla mnie, to problem może być rozwiązany za pomocą Wiosna 3.1 @Profiles, ponieważ @Conditional adnotacja dać szansę na zdefiniowanie pewnych strategię warunkowej rejestracji Bean (strategii zdefiniowanych przez użytkownika do sprawdzania warunkowego), które, gdy @Profiles puszka oparte na logice jedynie na Environment tylko zmienne.

Powiązane problemy