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
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки