2010-03-04 429 views
1

我有一个BeanDefinitionDecorator,它可以修改用户在bean上设置的属性。它工作正常;除非bean使用占位符。我试图找到一种策略来修改这些值,同时仍然可以在运行时访问原始值。什么这会看起来像XML的一个例子:在Spring中,你可以使用BeanDefinitionDecorator来改变属性的占位符值吗?

<bean id="bean"> 
    <property name="jdbcUrl" value="${jdbc.url}" /> 
    <d:spyDecorator /> 
</bean> 

我知道,用户将被写入JDBCURL财产“的jdbc:MYDATABASE”。我想要做的是将其属性更改为“jdbc:spy:myDatabase”。这很容易,如果他们只是使用字符串文字作为属性值,但是如果他们使用属性占位符,我不知道如何更改值 - 因为我需要原始值来提供新值。他们的关键是保持对用户透明的属性重写。

有没有可能的解决方案呢?

回答

2

我认为你的命名空间处理程序可以注册一个BeanFactoryPostProcessor(实现Ordererorder = Integer.MAX_VALUE是应用的最后一个后置处理器)。然后你的BeanDefinitionDecorator将注册正在装饰的bean,以便使用该后处理器进行处理(以某种方式在后处理器中实现它),后处理器将对该bean应用实际的属性修改。

+0

谢谢,这就是我一直在寻找的。我尝试使用BeanPostProcessor,但是获取属性为时已晚;这正是我所需要的。 – 2010-03-06 15:22:24

1

您可以使用PropertyPlaceholderConfigurer替代bean属性,别名和其他位置中的占位符的属性值。需要注意的是替换发生后的bean定义已加载,所以这种机制并不适用于<import>元素

例如:

... 
<bean id="ppc" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:build.properties</value> 
      <value>classpath:default-emmet-substitution.properties</value> 
      <value>classpath:default-danno-substitution.properties</value> 
      <value>classpath:default-dannotate-substitution.properties</value> 
      <value>classpath:substitution.properties</value> 
     </list> 
    </property> 
</bean> 
... 

欲了解更多信息,请参阅Spring框架文档的this section

编辑 - 我想从您的评论你已经熟悉了占位符替换是如何工作的,并使用PropertyPlaceholderConfigurer做替代品。所以,现在你需要这些策略,或某种组合之间进行选择:

  1. 执行占位符替换自己自定义BeanDefinitionDecorator。这将工作,虽然你会复制大量的代码。

  2. 定制BeanDefinitionDecorator是否将占位符名称修改为不同的占位符名称,以便拉入不同的值;例如"${jdbc.url}"变成"${spy.jdbc.url}"

  3. 扩展PropertyPlaceholderConfigurer类来修改替换的属性值;即覆盖convertPropertyconvertProperties。这就存在所有占位符都会得到修改后的值的潜在问题......不仅仅是你装饰过的bean中的那些值。

  4. 创建一个新的PropertyResourceConfigurer类来代替根据上下文不同的属性值。本质上,processProperties需要像PropertyPlaceholderConfigurer中的方法那样工作,但如果它看到bean属性或任何指示它执行“间谍”替换的内容,则可以做一些不同的事情。

2)和3)的组合看起来最有希望。

+0

这并不能真正回答我的问题。我知道如何使用属性占位符。 – 2010-03-05 16:53:25

相关问题