Spring IoC контейнер: Java конфигурация, условно включать классы @Configuration или @Bean-методы
Часто бывает полезно условно включить или отключить весь класс @Configuration или даже отдельные методы @Bean на основе некоторого произвольного состояния системы. Одним из распространенных примеров этого является использование аннотации @Profile для активации bean-компонентов только тогда, когда в среде Spring включен конкретный профиль.
Аннотация @Profile фактически реализована с помощью гораздо более гибкой аннотации под названием @Conditional. Аннотация @Conditional указывает конкретные реализации org.springframework.context.annotation.Condition, с которыми следует проконсультироваться до регистрации @Bean.
Реализации интерфейса Condition предоставляют метод matches(…), который возвращает true или false. Например, в следующем листинге показана фактическая реализация Condition, используемая для @Profile:
Java
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// Считываем атрибуты аннотации @Profile
MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
if (attrs != null) {
for (Object value : attrs.get("value")) {
if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
return true;
}
}
return false;
}
return true;
}
Kotlin
override fun matches(context: ConditionContext, metadata: AnnotatedTypeMetadata): Boolean {
// Считываем атрибуты аннотации @Profile
val attrs = metadata.getAllAnnotationAttributes(Profile::class.java.name)
if (attrs != null) {
for (value in attrs["value"]!!) {
if (context.environment.acceptsProfiles(Profiles .of(*value as Array<String>))) {
return true
}
}
return false
}
return true
}
Читайте также:
- Spring IoC контейнер: Java конфигурация, композиция конфигураций на основе Java, внедрение зависимостей от импортированных определений @Bean
- Spring IoC контейнер: Java конфигурация, композиция конфигураций на основе Java, полностью квалифицированные импортированные бины для простоты навигации
- Spring IoC контейнер: Java конфигурация, композиция конфигураций на основе Java, использование аннотации @Import
Комментарии
Отправить комментарий