spring
Условная регистрация бобов весной
Поиск…
замечания
Важное замечание при использовании условия
- Класс условия называется прямым классом (не как весенний боб), поэтому он не может использовать
@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")