在应用程序中维护全局状态时,有两个主要问题 -
- 共享全局常量
- 共享全局动态
对于(1)
,我使用PropertyPlaceholderConfigurer
将全局常量注入(inject)到bean中。
为了共享全局动态状态,我创建了一个包含公共(public)静态成员的中心类。例如
public class GlobalState {
public static MyObject myObj;
}
我无法注入(inject) myObj
,因为它的状态需要在运行时计算,然后在应用程序的所有模块之间共享。
我对上述方法中的紧密耦合感到不舒服。静态使得重构代码变得困难。稍后,如果我想在对 GlobalState 的所有读取调用上应用 Aspect
,这是不可能的。
使用 Spring 管理全局动态状态的最佳方法是什么?
这是我脑海中的两个假设(不知道 Spring 是否促进了这些)解决方案 -
- 在运行时动态地将
myObj
放入spring上下文中。和 然后要求 Spring 将新实例重新注入(inject)到所有 bean 中 声明依赖项(最初可以注入(inject) null 上下文已初始化)。 - 在 Spring 中有一个类似
ValueStack
的 Struts,我可以在上面放置我的 原始值和其他类可以使用以下方式从那里加载它 上下文引用。
最佳答案
为什么不注入(inject) GlobalState
并通过实例方法提供计算数据?
另外,我不明白为什么你不能注入(inject)运行时计算的结果(myObj
)?您可以例如实现 InitializingBean
以在应用程序的所有相关部分启动后触发计算(只需注入(inject)计算所需的内容,Spring 负责实例化顺序)。
更新
其他可能性是define beans being the result of a static factory method ,或创建 BeanDefinitionRegistryPostProcessor它会进行计算并将计算结果添加到应用程序上下文中。
关于java - Spring 共享全局状态的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16052270/