假设我有一个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只在上下文启动时才有效,因此不能用于我们的目的。是否有一个现有的设施在春天实现这一目标,或者有人可以推荐另一种方式?
答案 0 :(得分:4)
scope="prototype"
,这样每次需要一个实例时,都应该创建一个新实例。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
atrribute。
答案 1 :(得分:2)
看看Spring OSGi Compendium services,他们有一个名为“managed-properties”的属性管理器,它不仅允许您在运行时更新属性,而且在应用程序运行时如果您选择了“容器管理”更新策略。
答案 2 :(得分:0)
如果我理解了这个问题,你可以使用FactoryBean在Spring中自定义bean创建逻辑。