Пользовательский источник свойства 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();
    }
}

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

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