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

5
假设我有一个名为DialogBox的bean,具有高度和宽度属性:
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,但据我所知,它只适用于启动上下文,因此无法满足我们的需求。是否有现有的Spring工具可以实现此目的,或者有人可以推荐其他方法?


请参见https://dev59.com/BnRB5IYBdhLWcg3wuZfo。 - Vadzim
3个回答

4
  1. 使用FactoryBean(如已建议的)来定制实例化。
  2. 在bean上设置scope="prototype",这样每次需要实例时都应该创建一个新实例。
  3. 如果您想将prototype bean注入到singleton bean中,请使用lookup-method在此处搜索lookup-method

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

在各个“客户端”的@PostConstruct方法中,在已注入的对话框窗口上按需设置属性。例如:

public class MyDialogClient {
    @Autowired
    private Dialog dialog;

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

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


2

看看Spring OSGi 综合服务,它们有一个叫做“managed-properties”的属性管理器,它不仅允许您在运行时更新属性,而且如果您选择“container-managed”更新策略,则可以在应用程序运行时更新。


0

如果我理解问题正确的话,你可以使用FactoryBean在Spring中自定义bean创建逻辑。


谢谢您的回复。我已经澄清了我们想要实现的具体目标。这样是否更有意义? - Rich Kroll
你想说的是,每个客户端都会获得自己的dialogBox实例以及其自己的属性值,对吗?那么你如何确定是哪个客户端请求dialogBox并应用自定义值呢? - axtavt
当我提到客户端时,我指的是多租户客户端,例如可以在会话范围的变量中查找 - 因此每个租户或“客户端”都可以拥有自己的自定义属性。 - Rich Kroll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接