【问题标题】:Spring way of sharing global state?Spring 共享全局状态的方式?
【发布时间】:2013-04-09 18:09:45
【问题描述】:

在应用程序中维护全局状态时,有两个主要问题 -

  1. 共享全局常量
  2. 共享全局动态

对于(1),我使用PropertyPlaceholderConfigurer 将全局常量注入到bean 中。

为了共享全局动态状态,我创建了一个包含公共静态成员的中心类。例如

public class GlobalState {
    public static MyObject myObj;
}

我无法注入 myObj,因为它的状态需要在运行时计算,然后在应用程序的所有模块之间共享。

我对上述方法中的紧密耦合感到不舒服。静态使得代码难以重构。稍后,如果我想在所有对GlobalState 的读取调用上应用Aspect,这是不可能的。

使用 Spring 管理全局动态状态的最佳方法是什么?

这是我脑海中的两个假设的(不知道 Spring 是否促进这些)解决方案 -

  1. 在运行时动态地将myObj 放入spring 上下文中。和 然后要求 Spring 将新实例重新注入所有 bean 声明一个依赖项(null 可以在最初注入 上下文已初始化)。
  2. 在 Spring 中有一个类似 ValueStack 的 Struts,我可以在上面放置我的 原始值和其他类可以使用从那里加载它 上下文参考。

【问题讨论】:

  • 当你说state需要在运行时计算,是指在应用程序的生命周期中计算一次还是多次?

标签: java spring dependency-injection global-variables


【解决方案1】:

您为什么不注入GlobalState 并通过实例方法使您的计算数据可用?

另外,我不明白您为什么不能注入运行时计算的结果 (myObj)?你可以例如执行InitializingBean 以在应用程序的所有相关部分启动后触发计算(只需注入您计算所需的内容,Spring 负责实例化顺序)。

更新

其他可能性是define beans being the result of a static factory method,或者创建一个BeanDefinitionRegistryPostProcessor 来执行您的计算并将计算结果添加到应用程序上下文中。

【讨论】:

  • 第一点很好。然而,实现 InitializingBean 意味着 bean 自己负责进行计算。我想注入由单独组件完成的计算结果。更简洁地说 - 是否可以在上下文加载时间以外的某个时间将依赖项注入到 bean 中。
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 2010-10-28
  • 2021-06-14
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多