Подтвердить что ты не робот

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

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

@Autowired private ApplicationContext ctx;

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

@Component
public class PropertyHolder{

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

    // + getter methods
}

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

Ответ 3

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

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