Ответ 1
В случае, когда выражение SPeL должно быть динамическим, введите значение свойства вручную:
somePropValue = ctx.getEnvironment().getProperty("someProp");
Если у меня есть:
@Autowired private ApplicationContext ctx;
Я могу получить beans и ресурсы, используя один из методов getBean. Однако я не могу понять, как получить значения свойств.
Очевидно, я могу создать новый bean, который имеет свойство @Value, например:
private @Value("${someProp}") String somePropValue;
Какой метод я вызываю для объекта ApplicationContext для получения этого значения без autowiring bean?
Я обычно использую @Value, но есть ситуация, когда выражение SPeL должно быть динамическим, поэтому я не могу просто использовать аннотацию.
В случае, когда выражение SPeL должно быть динамическим, введите значение свойства вручную:
somePropValue = ctx.getEnvironment().getProperty("someProp");
Предполагая, что свойство ${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
Если вы застряли в Spring pre 3.1, вы можете использовать
somePropValue = ctx.getBeanFactory().resolveEmbeddedValue("${someProp}");