Поиск…


замечания

Важное замечание при использовании условия

  • Класс условия называется прямым классом (не как весенний боб), поэтому он не может использовать @Value свойства @Value т.е. никакие другие весенние бобы не могут быть введены внутри него.
  • Из java docs - Условия должны следовать тем же ограничениям, что и BeanFactoryPostProcessor и заботиться о том, чтобы никогда не взаимодействовать с экземплярами bean . Ограничения, рецензируемые здесь, - это BeanFactoryPostProcessor могут взаимодействовать и изменять определения bean-компонентов, но никогда не будут экземплярами bean. Это может привести к преждевременному созданию экземпляра компонента, нарушению контейнера и возникновению непреднамеренных побочных эффектов.

Зарегистрировать компоненты только в том случае, если указано свойство или значение

Весенний бобин может быть сконфигурирован таким образом, что он будет регистрироваться только в том случае, если он имеет определенное значение или заданное свойство выполнено. Для этого выполните Condition.matches чтобы проверить свойство / значение:

public class PropertyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("propertyName") != null;
        // optionally check the property value
    }
}

В конфигурации Java используйте приведенную выше реализацию как условие для регистрации компонента. Обратите внимание на использование @Conditional аннотации.

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional(PropertyCondition.class)
    public MyBean myBean() {
      return new MyBean();
    }
}

В PropertyCondition можно оценить любое количество условий. Тем не менее рекомендуется отделить реализацию для каждого условия, чтобы держать их слабо связанными. Например:

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional({PropertyCondition.class, SomeOtherCondition.class})
    public MyBean myBean() {
      return new MyBean();
    }
}

Аннотации условий

Кроме основной @conditional аннотации, для разных случаев существует множество подобных аннотаций.

Условия класса

@ConditionalOnClass и @ConditionalOnMissingClass позволяют @ConditionalOnMissingClass конфигурацию в зависимости от наличия или отсутствия определенных классов.

Например, когда OObjectDatabaseTx.class добавлен в зависимости и нет компонента OrientWebConfigurer мы создаем конфигуратор.

@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
    return new OrientWebConfigurer();
}

Условия боба

@ConditionalOnBean и @ConditionalOnMissingBean позволяют @ConditionalOnMissingBean компонент в зависимости от наличия или отсутствия конкретных компонентов. Вы можете использовать атрибут value для указания beans по типу или имени для указания beans по имени. Атрибут поиска позволяет ограничить иерархию ApplicationContext которая должна учитываться при поиске компонентов.

См. Пример выше, когда мы проверяем, нет ли определенного компонента.

Условия собственности

Аннотация @ConditionalOnProperty позволяет @ConditionalOnProperty конфигурацию на основе свойства Spring Environment. Используйте атрибуты префикса и имени, чтобы указать свойство, которое необходимо проверить. По умолчанию будет сопоставлено любое свойство, которое существует и не равно false . Вы также можете создавать более сложные проверки с использованием havingValue и matchIfMissing .

@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean 
public SomeBean someBean(){
}

Ресурсные условия

Аннотация @ConditionalOnResource позволяет @ConditionalOnResource конфигурацию только тогда, когда присутствует конкретный ресурс.

@ConditionalOnResource(resources = "classpath:init-db.sql") 

Условия веб-приложения

@ConditionalOnWebApplication и @ConditionalOnNotWebApplication позволяют @ConditionalOnNotWebApplication конфигурацию в зависимости от того, является ли приложение «веб-приложением».

@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}

Условия экспрессии SpEL

Аннотация @ConditionalOnExpression позволяет @ConditionalOnExpression конфигурацию на основе результата выражения SpEL.

@ConditionalOnExpression("${rest.security.enabled}==false")


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow