在运行时将动态属性应用于bean

时间:2010-01-05 18:26:43

标签: spring properties

假设我有一个bean DialogBox,其高度和宽度属性为:

public class DialogBox {
 int x;
 int y;
 ...
}

在我的applicationContext.xml中,我将属性定义为合理的默认值:

<bean id="dialogbox" class="DialogBox">
  <property name="x" value="100"/>
  <property name="y" value="100"/>
</bean>

我们有多个使用dialogBox bean的客户端,每个客户端都需要x和y的自定义值。我们讨论的一个路由是拥有多个属性文件,每个客户端一个,并将客户端ID映射到正确的文件,例如客户端123将映射到dialogbox_123.properties:

dialogbox_123.properties:
x=200
y=400

然后在运行时请求bean时,spring会查看客户端是否存在自定义属性文件,并使用这些属性,否则使用默认值。我知道PropertyOverrideConfigurer,但AFAIK只在上下文启动时才有效,因此不能用于我们的目的。是否有一个现有的设施在春天实现这一目标,或者有人可以推荐另一种方式?

3 个答案:

答案 0 :(得分:4)

  1. 使用FactoryBean(如已建议的那样)自定义实例化。
  2. 在bean上设置scope="prototype",这样每次需要一个实例时,都应该创建一个新实例。
  3. 如果您想将prototype bean注入singleton bean,请使用lookup-methodSearch for lookup-method here
  4. 我不确定这是否适合你的情况。另一个建议是:

    在各种“客户端”的@PostConstruct方法中,在已注入的对话框窗口中根据需要设置属性。像:

    public class MyDialogClient {
        @Autowired
        private Dialog dialog;
    
        @PostConstruct
        public void init() {
            dialog.setWidth(150); //or read from properties file
            dialog.setHeight(200);
        }
        ...
    }
    

    同样,在这种情况下,您可以使用scope atrribute。

答案 1 :(得分:2)

看看Spring OSGi Compendium services,他们有一个名为“managed-properties”的属性管理器,它不仅允许您在运行时更新属性,而且在应用程序运行时如果您选择了“容器管理”更新策略。

答案 2 :(得分:0)

如果我理解了这个问题,你可以使用FactoryBean在Spring中自定义bean创建逻辑。