Niestandardowe źródło właściwości Spring nie rozwiązuje symboli zastępczych w @Value

Próbuję zbudować źródło PropertySource Spring 3.1, które odczytuje jego wartości z węzłów strażnika. Do łączenia się z Zookeeperem używamKurator z Netflix.

W tym celu zbudowałem niestandardowe źródło właściwości, które odczytuje wartość właściwości Zookeepera i zwraca ją. Działa to dobrze, gdy rozwiązuję taką właściwość

ZookeeperPropertySource zkPropertySource = new ZookeeperPropertySource(zkClient);
ctx.getEnvironment().getPropertySources().addLast(zkPropertySource);
ctx.getEnvironment().getProperty("foo"); // returns 'from zookeeper'

Jednak gdy próbuję utworzyć instancję komponentu bean z polem z adnotacją @Value, to kończy się niepowodzeniem:

@Component
public class MyBean {
    @Value("${foo}") public String foo;
}

MyBean b = ctx.getBean(MyBean.class); // fails with BeanCreationException

Ten problem najprawdopodobniej nie ma nic wspólnego z Zookeeperem, ale ze sposobem rejestrowania źródeł własności i tworzenia fasoli.

Każdy wgląd jest bardzo ceniony.

Aktualizacja 1:

Tworzę kontekst aplikacji z pliku XML w następujący sposób:

public class Main {
    public static void main(String[] args) throws Exception {
        ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        ctx.registerShutdownHook();
    }
}

Klasą, która łączy się z Zookeeperem, jest @ 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);
    }
}

Aktualizacja 2

Wydaje się to działać, gdy używam konfiguracji bez XML-a, tj. @Configuration, @ComponentScan i @PropertySource w połączeniu z AnnotationConfigApplicationContext. Dlaczego nie działa z ClassPathXmlApplicationContext?

@Configuration
@ComponentScan("com.goleft")
@PropertySource({"classpath:config.properties","classpath:version.properties"})
public class AppConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

questionAnswers(1)

yourAnswerToTheQuestion