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

Ric*_*oll 5 spring properties

假设我有一个Bean DialogBox,它具有高度和宽度的属性:

public class DialogBox {
 int x;
 int y;
 ...
}
Run Code Online (Sandbox Code Playgroud)

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

<bean id="dialogbox" class="DialogBox">
  <property name="x" value="100"/>
  <property name="y" value="100"/>
</bean>
Run Code Online (Sandbox Code Playgroud)

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

dialogbox_123.properties:
x=200
y=400
Run Code Online (Sandbox Code Playgroud)

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

Boz*_*zho 4

  1. 使用FactoryBean(如已经建议的那样)来自定义实例化。
  2. 在 bean 上设置scope="prototype",以便每次需要实例时,都应创建一个新实例。
  3. 如果您想将prototypebean 注入到singletonbean 中,请使用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);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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