Подтвердить что ты не робот

Условное создание spring bean

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

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

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

@Autowired
Environment env;

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

createWebsocket=true/false

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

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

4b9b3361

Ответ 1

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

Сначала создайте класс 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:

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

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

Ответ 2

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

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

Ответ 3

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