春天分享全球状态的方式?

时间:2013-04-17 05:33:06

标签: java spring dependency-injection global-variables

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

  1. 分享全局常量
  2. 分享全球动态状态
  3. 对于(1),我使用PropertyPlaceholderConfigurer将全局常量注入到bean中。

    为了共享全局动态,我创建了一个带有公共静态成员的中心类。 e.g。

    public class GlobalState {
        public static MyObject myObj;
    }
    

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

    我对上述方法中的紧耦合感到不舒服。静态使得重构代码变得困难。如果我想对Aspect的所有读取呼叫应用GlobalState,那么以后就不可能了。

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

    以下是两个假设的(不知道Spring是否有助于这些)解决方案 -

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

1 个答案:

答案 0 :(得分:0)

为什么不注入GlobalState并通过实例方法提供计算数据?

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

更新

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