Spring IoC контейнер: абстракция Environment, использование @PropertySource

Аннотация @PropertySource предоставляет удобный и декларативный механизм для добавления PropertySource в Spring Environment.

Учитывая файл с именем app.properties, который содержит пару ключ-значение testbean.name=myTestBean, следующий класс @Configuration использует @PropertySource таким образом, что вызов testBean.getName() возвращает myTestBean:

Java

@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {

    @Autowired
    Environment env;

    @Bean
    public TestBean testBean() {
        TestBean testBean = new TestBean();
        testBean.setName(env.getProperty("testbean.name"));
        return testBean;
    }
}

Kotlin

@Configuration
@PropertySource("classpath:/com/myco/app.properties")
class AppConfig {

    @Autowired
    private lateinit var env: Environment

    @Bean
    fun testBean() = TestBean().apply {
        name = env.getProperty("testbean.name")!!
    }
}

Любые заполнители ${…}, присутствующие в расположении ресурса @PropertySource, разрешаются в отношении набора источников свойств, уже зарегистрированных в среде, как показано в следующем примере:

Java

@Configuration
@PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties")
public class AppConfig {

    @Autowired
    Environment env;

    @Bean
    public TestBean testBean() {
        TestBean testBean = new TestBean();
        testBean.setName(env.getProperty("testbean.name"));
        return testBean;
    }
}

Kotlin

@Configuration
@PropertySource("classpath:/com/\${my.placeholder:default/path}/app.properties")
class AppConfig {

    @Autowired
    private lateinit var env: Environment

    @Bean
    fun testBean() = TestBean().apply {
        name = env.getProperty("testbean.name")!!
    }
}

Предполагая, что my.placeholder присутствует в одном из уже зарегистрированных источников свойств (например, в системных свойствах или переменных среды), заполнитель преобразуется в соответствующее значение. Если нет, то по умолчанию используется default/path. Если значение по умолчанию не указано и свойство не может быть разрешено, создается исключение IllegalArgumentException.

Аннотация @PropertySource является повторяемой в соответствии с соглашениями Java 8. Однако все такие аннотации @PropertySource должны быть объявлены на одном уровне либо непосредственно в классе конфигурации, либо как метааннотации в одной и той же настраиваемой аннотации. Смешивать прямые аннотации и метааннотации не рекомендуется, поскольку прямые аннотации эффективно переопределяют метааннотации.

Разрешение заполнителей в утверждениях

Исторически сложилось так, что значение заполнителей в элементах могло быть разрешено только относительно системных свойств JVM или переменных среды. Это уже не так. Поскольку абстракция Environment интегрирована по всему контейнеру, через нее легко маршрутизировать разрешение заполнителей. Это означает, что вы можете настроить процесс разрешения по своему усмотрению. Вы можете изменить приоритет поиска по системным свойствам и переменным среды или полностью удалить их. При необходимости вы также можете добавить свои собственные источники свойств.

Конкретно, следующий оператор работает независимо от того, где определено свойство customer, если оно доступно в среде:

<beans>
    <import resource="com/bank/service/${customer}-config.xml"/>
</beans>


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


Комментарии

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

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

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

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