Spring 共享全局状态的方式?
Posted
技术标签:
【中文标题】Spring 共享全局状态的方式?【英文标题】:Spring way of sharing global state? 【发布时间】:2013-04-09 18:09:45 【问题描述】:在应用程序中维护全局状态时,有两个主要问题 -
-
共享全局常量
共享全局动态
对于(1)
,我使用PropertyPlaceholderConfigurer
将全局常量注入到bean 中。
为了共享全局动态状态,我创建了一个包含公共静态成员的中心类。例如
public class GlobalState
public static MyObject myObj;
我无法注入 myObj
,因为它的状态需要在运行时计算,然后在应用程序的所有模块之间共享。
我对上述方法中的紧密耦合感到不舒服。静态使得代码难以重构。稍后,如果我想在所有对GlobalState
的读取调用上应用Aspect
,这是不可能的。
使用 Spring 管理全局动态状态的最佳方法是什么?
这是我脑海中的两个假设的(不知道 Spring 是否促进这些)解决方案 -
-
在运行时动态地将
myObj
放入spring 上下文中。和
然后要求 Spring 将新实例重新注入所有 bean
声明一个依赖项(null 可以在最初注入
上下文已初始化)。
在 Spring 中有一个类似 ValueStack
的 Struts,我可以在上面放置我的
原始值和其他类可以使用从那里加载它
上下文参考。
【问题讨论】:
当你说state需要在运行时计算,是指在应用程序的生命周期中计算一次还是多次? 【参考方案1】:您为什么不注入GlobalState
并通过实例方法使您的计算数据可用?
另外,我不明白您为什么不能注入运行时计算的结果 (myObj
)?你可以例如执行InitializingBean
以在应用程序的所有相关部分启动后触发计算(只需注入您计算所需的内容,Spring 负责实例化顺序)。
更新
其他可能性是define beans being the result of a static factory method,或者创建一个BeanDefinitionRegistryPostProcessor 来执行您的计算并将计算结果添加到应用程序上下文中。
【讨论】:
第一点很好。然而,实现 InitializingBean 意味着 bean 自己负责进行计算。我想注入由单独组件完成的计算结果。更简洁地说 - 是否可以在上下文加载时间以外的某个时间将依赖项注入到 bean 中。以上是关于Spring 共享全局状态的方式?的主要内容,如果未能解决你的问题,请参考以下文章
Vue总结第六天:Vuex (全局变量管理~多个页面共享数据)