Spring 3.1 PropertySourcesPlaceholderConfigurer和条件导入

看看3.1中的新Spring属性支持( http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/ ),看起来应该是可行的:

  

其中login.security位于application-customer-dev.properties中:

 login.security=dev 

(并且security-dev.xml确实存在于适当的位置)。 我错过了一些东西,因为login.security无法解决。 我希望在3.1之前的版本中出现这种行为,但看起来这应该对3.1(我们正在使用)有效吗?

您链接的脚注[2]:

[2]:因为在调用BeanFactoryPostProcessors之前必然会处理元素,这意味着甚至PropertyPlaceholderConfigurer在这里也无法提供帮助。 由于环境及其PropertySource集在容器刷新之前配置,因此可以针对环境解析元素中的占位符,而不会出现任何生命周期问题。

更新

根据PropertySourcesPlaceholderConfigurer的javadoc , PropertySourcesPlaceholderConfigurer是一个BeanFactoryPostProcessor ,因此脚注的真正含义是安装PropertySourcesPlaceholderConfigurer 之前解析导入,因此它也不起作用 (事实上​​,在被解析时) ,配置器可能还不存在!)是的,当它安装时它将查看Environment ,但你不能用它来解析 ,因为那时没有后处理器可操作。 这包括PropertySourcesPlaceholderConfigurer

基本上Spring XML上下文设置或多或少像这样:

  1. 上下文已创建。
  2. Environment已经确定。
  3. 读取XML(所有XML,必要时解析导入)。 Bean定义已创建。
  4. 安装并调用BeanFactoryPostProcessor ,处理bean定义。
  5. BeanPostProcessor已安装。
  6. Bean根据bean定义进行实例化。 应用BeanPostProcessors。

这是一个类似的问题,导致您无法使用许多后处理器的order属性在BeanFactoryPostProcessor之前应用BeanPostProccesor (执行类似于使PropertyPlaceholderConfigurer@PersistenceContext解析占位符):在Spring应用程序中对行为进行硬编码上下文,所以你必须通过专门化一些Spring类来解决它。

我认为你错误地阅读了博客@Kurt – 如果在开始创建bean定义之前包含属性的属性源存在,则应该解决它。

因此,以下两种方式来解决导入:1。使用此参数设置环境变量(-Dlogin.security=dev) ,默认情况下将注册为属性源
2.以编程方式将文件注册为属性源,在博客文章中提到通过编写自定义ApplicationContextInitializer来注册属性源 – 您应该能够使用ResourcePropertySource来注册基于文件的属性源

@Inject Environment和使用配置文件应该更容易实现您现在所需的内容。 您不应该替换部分文件名。