【问题标题】:Apply dynamic properties to a bean at runtime在运行时将动态属性应用于 bean
【发布时间】:2011-01-01 18:21:40
【问题描述】:

假设我有一个 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 仅在上下文启动时才有效,因此不适用于我们的目的。春季是否有现有设施可以实现这一目标,或者有人可以推荐另一种方式吗?

【问题讨论】:

标签: spring properties


【解决方案1】:

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

【讨论】:

  • 感谢您的回复。我澄清了我们到底想要达到的目标。这更有意义吗?
  • 你想说,每个客户端都有自己的 dialogBox 实例和自己的属性值,对吧?您如何确定哪个客户端请求对话框应用自定义值?
  • 当我提到一个客户端时,我的意思是一个多租户客户端,例如可以在会话范围的变量中查找它——因此每个租户或“客户端”都可以有自己的自定义属性
【解决方案2】:
  1. 使用FactoryBean(如前所述)自定义实例化。
  2. 在 bean 上设置 scope="prototype",这样每次需要一个实例时,都应该创建一个新实例。
  3. 如果要将prototype bean 注入singleton bean,请使用lookup-method (Search for lookup-method here)

我不确定这是否适合您的情况。另一个建议是:

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

public class MyDialogClient {
    @Autowired
    private Dialog dialog;

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 2013-03-27
      • 2021-03-02
      • 2013-02-26
      • 2011-01-21
      • 2013-06-29
      • 2010-10-30
      相关资源
      最近更新 更多