2012-05-30 10 views
27

Если у меня есть:Как получить значение свойства из объекта ApplicationContext? (Не используя аннотацию)

@Autowired private ApplicationContext ctx; 

я могу получить бобы и ресурсы, используя один из самых getBean методов. Однако я не могу понять, как получить значения свойств.

Очевидно, что я могу создать новый компонент, который имеет свойство @value как:

private @Value("${someProp}") String somePropValue; 

Какой метод я называю на объекте ApplicationContext, чтобы получить это значение без автоматического связывания боба?

Обычно я использую @Value, но есть ситуация, когда выражение SPeL должно быть динамическим, поэтому я не могу просто использовать аннотацию.

+0

(YourBeanType) ctx.getBean ("BeanId"); –

ответ

11

Предполагая, что объект ${someProp} принадлежит собственности PropertyPlaceHolderConfigurer, это затрудняет работу. PropertyPlaceholderConfigurer - это BeanFactoryPostProcessor и, как таковой, доступен только при загрузке контейнера. Таким образом, свойства не доступны для компонента во время выполнения.

Решение будет заключаться в создании своего рода компонента с атрибутом ценности, который вы инициализируете с помощью свойства/свойств, которые вам нужны.

@Component 
public class PropertyHolder{ 

    @Value("${props.foo}") private String foo; 
    @Value("${props.bar}") private String bar; 

    // + getter methods 
} 

Теперь вводить этот PropertyHolder везде, где вам нужны свойства и получить доступ к свойствам с помощью методов геттерных

+0

Пример был бы очень полезен здесь. – Webnet

+0

@Webnet ok, добавлен небольшой пример –

+0

Разве это не требует, чтобы 'PropertyHolder' был управляемым компонентом? Я думаю, @HappyEngineer искал решение, которое не управляется bean (как я). – Webnet

33

В том случае, когда выражение SPEL должно быть динамичными, получить значение свойства вручную:

somePropValue = ctx.getEnvironment().getProperty("someProp"); 
+2

Использование среды во время выполнения (как было указано только при запуске), как правило, очень плохая идея, поскольку она проходит через JNDI и другие локации, которые ищут стоимость, которая стоит дорого. – kaqqao

8

Если вы застряли на Spring предварительно 3.1, вы можете использовать

somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");