2012-02-09 70 views
11

综观3.1(http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/)新的春天属性的支持,它看起来像这应该是可能的:春3.1 PropertySourcesPlaceholderConfigurer和有条件进口

<context:property-placeholder location="/WEB-INF/application-customer-dev.properties,classpath:application-customer.properties" ignore-resource-not-found="true"/> 

<import resource="classpath*:com/x/core/security/security-${login.security}.xml"/> 

其中login.security是application-customer-dev.properties如:

login.security=dev 

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

+0

当您尝试此操作时会发生什么?错误,没有,等等? – 2012-02-09 21:11:42

+0

只是一个错误,指出“无法解析占位符'login.security'”。 – 2012-02-09 21:27:32

回答

3

脚注[2]您的链接:

[2]:由于<import/>元素的处理被调用之前BeanFactoryPostProcessor的,这意味着即使PropertyPlaceholderConfigurer不能帮助这里一定发生。由于在容器刷新之前配置了Environment及其一系列PropertySources,因此可以根据环境对元素中的占位符进行解析,而不存在任何生命周期问题。

UPDATE

按照javadoc for PropertySourcesPlaceholderConfigurerPropertySourcesPlaceholderConfigurerBeanFactoryPostProcessor,还等什么脚注确实说的是,在导入之前的PropertySourcesPlaceholderConfigurer解决安装,所以它将无法​​正常工作要么(事实上​​,在<import/>得到解决的时候,配置者甚至可能不存在呢!)是的,当它被安装它会看Environment,但你不能没有使用它来解决一个<import/>里面,因为当时后置处理器是有效的。这包括PropertySourcesPlaceholderConfigurer

基本上春天XML上下文设置去或多或少是这样的:创建

  1. 语境。
  2. Environment设置。
  3. XML被读取(所有的XML,如果有必要解决进口)。 Bean定义已创建。
  4. BeanFactoryPostProcessor s的安装和调用,处理bean定义。
  5. BeanPostProcessor s的安装。
  6. Bean根据bean定义进行实例化。 BeanPostProcessors被应用。

这是因为,类似的问题,这会导致您无法使用许多后处理器的order财产BeanFactoryPostProcessor(做这样的事情使从@PersistenceContext一个PropertyPlaceholderConfigurer决心占位符)之前申请一个BeanPostProccesor:行为是在Spring应用程序上下文中硬编码,所以你必须通过专门化一些Spring类来解决它。

+0

是的,PropertyPlaceholderConfigurer无法帮助(如默认的3.1之前的版本),但新的PropertySourcesPlaceholderConfigurer(spring 3.1)将在环境中查找以解析这些值。该脚注基本上确认它应该起作用。 – 2012-02-09 21:25:08

+0

@KurtPeterschmidt我已经更新了我的答案,希望现在有点更清楚 – gpeche 2012-02-10 17:00:16

+0

感谢您的补充说明。 – 2012-02-13 16:15:42

1

我认为你是错读博客有点@Kurt - 它应该能够解决如果包含该属性的属性源存在的bean定义开始被创建之前。

于是方式让您的进口,以解决将这些方法有两种:1。 设置环境变量,这个参数(-Dlogin.security=dev)将默认
2.注册为一个属性源注册一个文件的属性源编程,通过编写自定义ApplicationContextInitializer注册你的财产来源的博客文章中提到的 - 你应该能够使用ResourcePropertySource注册您的基于文件属性源

0

你现在需要通过@Inject Environment它应该是更容易并使用配置文件。你不需要替换文件名的一部分。