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 (全局变量管理~多个页面共享数据)

java的全局变量都有哪些作用?

vue中什么叫全局状态?

基于Mobx的多页面小程序的全局共享状态管理实践

Spring Cloud Alibaba-全局配置自定义和支持的配置项

14.vuex和localStorage,全局变量的区别