java - Spring 共享全局状态的方式?

标签 java spring dependency-injection global-variables

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

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

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

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

public class GlobalState {
    public static MyObject myObj;
}

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

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

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

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

  1. 在运行时动态地将myObj放入spring上下文中。和 然后要求 Spring 将新实例重新注入(inject)到所有 bean 中 声明依赖项(最初可以注入(inject) null 上下文已初始化)。
  2. 在 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/

相关文章:

java - 什么时候在 Spring 中使用 javax.inject.Provider?

java - Java中的继承和多态

java - Guice测试类是否已经创建

java - Jackson 的 mixin 类不能解决问题 : bug or am I doing something wrong?

spring - 使用 Spring Bean 声明覆盖 Grails 中的服务

php - 业务逻辑放在 Lumen 哪里?

java - spring security intercept-url 对我不起作用

java - 在 springdoc-openapi-ui 中启用“授权”按钮以进行不记名 token 身份验证 (JWT)

java - Spring 4框架编译错误

c# - 在 C# 中延迟任务 - 释放数据库上下文