2

我有点迷失在 Spring 的属性替换机制中。假设我有这个 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并定义一个用于扫描的自定义基本包,使用自定义占位符,如下所示 @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 没有实现 Interface EnvironmentCapable。到这里,我对 Spring App-Context Bootstrapping 的理解到此结束。

有人可以帮我吗?是否有一个 BeanDefinitionRegistry 能够提供Environment使用我的属性占位符的实例?

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

干杯,斯特凡

4

1 回答 1

1

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

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

于 2014-03-05T10:48:43.640 回答