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

Если у меня есть:

@Autowired private ApplicationContext ctx;

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

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

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

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

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

 Todd Murray30 мая 2012 г., 21:39
(YourBeanType) ctx.getBean ( "beanId");

Ответы на вопрос(3)

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

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

@Component
public class PropertyHolder{

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

    // + getter methods
}

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

 Webnet24 сент. 2013 г., 23:25
Пример был бы очень полезен здесь.
 Webnet25 сент. 2013 г., 13:46
Разве это не требует того, чтобыPropertyHolder управляемый боб? Я думаю, @HappyEngineer искал решение, которое не является управляемым компонентом (как и я).
 Sean Patrick Floyd25 сент. 2013 г., 17:19
@ Webnet, я понимаю, но AFAIK это невозможно в Spring (по крайней мере, с помощью механизма PropertyPlaceholderConfigurer)
 Sean Patrick Floyd25 сент. 2013 г., 08:03
@ Webnet хорошо, добавил небольшой пример

вы можете использовать

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

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

somePropValue = ctx.getEnvironment().getProperty("someProp");
 kaqqao05 сент. 2015 г., 01:50
Использование среды во время выполнения (в отличие от запуска) обычно является очень плохой идеей, так как она проходит через JNDI и другие места в поисках значения, которое стоит дорого.

Ваш ответ на вопрос