Spring IoC контейнер: абстракция Environment, профили определения компонентов, активация профиля

Теперь, когда мы обновили нашу конфигурацию, нам все еще нужно указать Spring, какой профиль активен. Если бы мы запустили наш пример приложения прямо сейчас, мы бы увидели исключение NoSuchBeanDefinitionException, потому что контейнер не смог найти bean-компонент Spring с именем dataSource.

Активация профиля может быть выполнена несколькими способами, но самый простой - это сделать это программно с помощью API среды, доступного через ApplicationContext. В следующем примере показано, как это сделать:

Java

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("development");
ctx.register(SomeConfig.class, StandaloneDataConfig.class, JndiDataConfig.class);
ctx.refresh();

Kotlin

val ctx = AnnotationConfigApplicationContext().apply {
    environment.setActiveProfiles("development")
    register(SomeConfig::class.java, StandaloneDataConfig::class.java, JndiDataConfig::class.java)
    refresh()
}

Кроме того, вы также можете декларативно активировать профили через свойство spring.profiles.active, которое может быть указано через системные переменные среды, системные свойства JVM, параметры контекста сервлета в web.xml или даже как запись в JNDI. В интеграционных тестах активные профили могут быть объявлены с помощью аннотации @ActiveProfiles в модуле spring-test.

Обратите внимание, что профили не являются предложением "или-или". Вы можете активировать сразу несколько профилей. Программно вы можете предоставить несколько имен профилей методу setActiveProfiles(), который принимает String… varargs. В следующем примере активируется несколько профилей:

Java

ctx.getEnvironment().setActiveProfiles("profile1", "profile2");

Kotlin

ctx.getEnvironment().setActiveProfiles("profile1", "profile2")

Декларативно spring.profiles.active может принимать список имен профилей, разделенных запятыми, как показано в следующем примере:

-Dspring.profiles.active="profile1,profile2"


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


Комментарии

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

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

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

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