2015-04-24 3 views
22

У меня вопрос о конфигурациях аннотаций Spring. У меня есть фасоль:Условное создание весеннего боба

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

и у меня есть свойство файла:

@Autowired 
Environment env; 

В файле свойств я хочу иметь специальное булево свойство

createWebsocket=true/false 

, который подписывает ли боба Необходимо создать ObservationWebSocketClient. Если значение свойства false, я вообще не хочу устанавливать соединение с веб-сокетом.

Есть ли техническая возможность реализовать это?

+0

Не имеет прямого ответа на ваш вопрос, но может быть, весенний профиль подходит для вас? Таким образом, bean создается только в профиле, где он необходим (например, тест, разработка, производство ...) – DrunkenPope

ответ

31

Хотя я не использовал эту функцию, кажется, что вы можете сделать это с помощью весны 4's @Conditional annotation.

Во-первых, создать Condition класс, в котором ConditionContext имеет доступ к 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")); 
    } 
} 

Затем аннотировать боб:

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

редактироватьspring-boot аннотацию @ConditionalOnProperty внедрила этот обобщенно; исходный код для Condition, используемый для оценки is available on github here для заинтересованных. Если вы часто нуждаетесь в этой функциональности, использование подобной реализации было бы целесообразным, а не создавать множество пользовательских реализаций Condition.

+0

@chrylis Какое лучшее решение? Возврат 'null' из метода' monitoringWebSocketClient'? – beerbajay

+0

Добавлено (требуется некоторое время для ввода на мобильный). – chrylis

+0

Пожалуйста, посмотрите ниже, используя ConditionalOnProperty. Это кажется более эффективным. –

24

Аннотировать свой bean-метод с помощью @ConditionalOnProperty("createWebSocket").

Обратите внимание, что Spring Boot предлагает ряд полезных условий, предварительно упакованных.

+4

Является ли это «весенняя ботинок» конкретным? – beerbajay

+0

@beerbajay Я так не считаю, и если да, то аннотация может быть включена без включения автоконфигурации. По сути, это очень похоже на ваше предложение, за исключением обобщенных и предварительно реализованных. – chrylis

+1

Hrmm, кажется, только 'spring-boot': [javadocs] (http://docs.spring.io/autorepo/docs/spring-boot/current/api/org/springframework/boot/autoconfigure/condition/ConditionalOnProperty .html) – beerbajay

0

Что касается меня, эта проблема может быть решена с помощью Spring 3.1 @Profiles, потому что @Conditional аннотацию даст вам возможность определить некоторую стратегию для условной регистрации боба (определяемых пользователем стратегий для условной проверки), когда @Profiles может, на основе логики только Environment только переменные.

Смежные вопросы