在Spring Java配置的注释中使用占位符

时间:2014-03-05 10:40:52

标签: java spring spring-data spring-data-mongodb spring-java-config

我在Spring的Property Replacement机制中有点迷失。假设我有这个Java Config

@Configuration
@ComponentScan(basePackageClasses = Application.class)
@PropertySources({
    @PropertySource("classpath:/config/default.properties")
})
public class ApplicationConfig {

@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
    PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
    return pspc;
}

现在我想添加一个Spring-Data Annotation @EnableMongoRepositories并使用自定义占位符定义一个用于扫描的自定义basepackage,如下所示 @EnableMongoRepositories("${my.custom.repobasepackage}")。占位符在我的default.properties中定义。

但是,此属性无法在此解析。当深入了解Spring的财产替换时,我可以看到它试图解决该属性,所以有可能这样做。

但是,用于替换占位符的基础Environment类不知道我的PropertyPlaceholderConfigurer,但只了解我的SystemProperties和我的VM-Props。 : - (

我可以在org.springframework.context.annotation.ClassPathBeanDefinitionScanner#getOrCreateEnvironment.java#339(我正在使用Spring 4.0.1 )中看到我的“PropertyPlaceholder”已经到位,所以它不是初始化中的排序问题,但是没有使用,因为使用的BeanDefinitionRegistry没有实现接口EnvironmentCapable。在这里,我对Spring App-Context Bootstrapping的理解就在最后。

有人可以帮我吗?是否有BeanDefinitionRegistry能够提供使用我的Property Placeholder的Environment实例?

任何帮助都非常感谢!!我为你准备了饼干! :-))

干杯,斯蒂芬

1 个答案:

答案 0 :(得分:1)

我认为@PropertySources(你只有一个,所以你不需要包装器)被添加到Environment 之后配置类是因此处理这些类本身的其中一个注释为时已晚。您可以通过将my.custom.repobasepackage设置为系统属性来验证这一点。

作为替代方案,我鼓励您尝试Spring Boot(在处理任何配置之前application.properties添加Environment)。