我在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
实例?
任何帮助都非常感谢!!我为你准备了饼干! :-))
干杯,斯蒂芬
答案 0 :(得分:1)
我认为@PropertySources
(你只有一个,所以你不需要包装器)被添加到Environment
之后配置类是因此处理这些类本身的其中一个注释为时已晚。您可以通过将my.custom.repobasepackage
设置为系统属性来验证这一点。
作为替代方案,我鼓励您尝试Spring Boot(在处理任何配置之前application.properties
添加Environment
)。