Пользовательский источник свойства Spring не разрешает заполнители в @Value
Я пытаюсь создать PropertySource Spring 3.1, который считывает его значения из узлов Zookeeper. Для подключения к Zookeeper я используюкуратор от Netflix.
Для этого я создал собственный источник свойств, который считывает значение свойства из Zookeeper и возвращает его. Это прекрасно работает, когда я решаю свойство, как это
ZookeeperPropertySource zkPropertySource = new ZookeeperPropertySource(zkClient);
ctx.getEnvironment().getPropertySources().addLast(zkPropertySource);
ctx.getEnvironment().getProperty("foo"); // returns 'from zookeeper'
Однако, когда я пытаюсь создать экземпляр bean-компонента с полем с аннотацией @Value, произойдет сбой:
@Component
public class MyBean {
@Value("${foo}") public String foo;
}
MyBean b = ctx.getBean(MyBean.class); // fails with BeanCreationException
Эта проблема, скорее всего, не имеет ничего общего с Zookeeper, но с тем, как я регистрирую источники свойств и создаю компоненты.
Любое понимание высоко ценится.
Update 1:
Я создаю контекст приложения из файла XML следующим образом:
public class Main {
public static void main(String[] args) throws Exception {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ctx.registerShutdownHook();
}
}
Класс, который подключается к Zookeeper, является @Component.
@Component
public class Server {
CuratorFramework zkClient;
public void connectToZookeeper() {
zkClient = ... (curator magic) ...
}
public void registerPropertySource() {
ZookeeperPropertySource zkPropertySource = new ZookeeperPropertySource(zkClient);
ctx.getEnvironment().getPropertySources().addLast(zkPropertySource);
ctx.getEnvironment().getProperty("foo"); // returns 'from zookeeper'
}
@PostConstruct
public void start() {
connectToZookeeper();
registerPropertySource();
MyBean b = ctx.getBean(MyBean.class);
}
}
Update 2
Кажется, это работает, когда я использую конфигурацию без XML, то есть @Configuration, @ComponentScan и @PropertySource в сочетании с AnnotationConfigApplicationContext. Почему он не работает с ClassPathXmlApplicationContext?
@Configuration
@ComponentScan("com.goleft")
@PropertySource({"classpath:config.properties","classpath:version.properties"})
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}