【问题标题】:Static Singleton Instance of Spring's ApplicationContextSpring 的 ApplicationContext 的静态单例实例
【发布时间】:2015-08-28 16:21:54
【问题描述】:

我正在尝试将使用 CURAM 编写的应用程序移植到 Struts2 项目中。我们正在使用 Spring 来利用其数据库事务功能。按照在 CURAM 应用程序中编写应用程序代码的方式,我不能使用 Spring 的依赖注入功能。我需要能够从我的业务逻辑中的任何位置访问 Spring ApplicationContext。并且在我需要时创建一个新的 ApplicationContext 实例,这会使事情变得急促。

我在 Internet 上找到了这个资源,它向您展示了如何创建 Spring 的 ApplicationContext 的静态单例实例。

Access the Spring-ApplicationContext from everywhere in your Application

这可以解决我的问题,但我有顾虑。静态单例实例不是意味着每个调用 Struts2 操作的用户都会从同一个 ApplicationContext 实例中获取业务对象吗?

默认情况下,Spring bean 是 ApplicationContext 实例中的单例。因此,我认为 ApplicationContext 的静态单例实例会导致所有用户/事务使用所有业务对象的相同实例,这会破坏事务并可能导致整个地方的锁定。我的假设是否正确?

如果我将所有 Spring Bean 声明为原型会怎样?这是否允许我在使用 ApplicationContext 的静态单例实例时利用 Springs 数据库事务/并发处理功能?

谢谢。

【问题讨论】:

  • 事务通过线程本地管理。 Spring 已经想通了。但是,我建议您运行一些多线程一致性检查,例如使用jmeter,以确保一切正常,考虑到您正在研究的一些低级内容。

标签: java spring applicationcontext


【解决方案1】:

静态单例实例不是意味着每个调用 Struts2 操作的用户都会从同一个 ApplicationContext 实例中获取业务对象吗?

是的

我认为 ApplicationContext 的静态单例实例会导致所有用户/事务使用所有业务对象的相同实例

是的

这会破坏交易并可能导致到处都被锁定。

没有。为什么会破坏交易?为什么会有锁?业务服务通常是完全无状态的,因此可以作为单例。一个典型的 Spring 应用程序只有一个应用程序上下文,包含单例 bean。这就是它的设计工作方式。事务上下文不存储在业务对象中。它存储在 ThreadLocal 中。

【讨论】:

  • 感谢您的回复。这是否意味着可以为应用程序使用 Spring 的 ApplicationContext 的静态单例实例?
  • 是的,这样做没关系。
【解决方案2】:

如果你创建一个没有公共变量的类,使用 siglton 将是最好的选择。你可以@Autowired 必要的 сlass like Dao 或 Services 类

如果你的类是原型并且你每次都从 Applicationcontext 获取 Bean,它是一个新对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    相关资源
    最近更新 更多