Spring 的 ApplicationContext 的静态单例实例

Static Singleton Instance of Spring's ApplicationContext

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

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

Access the Spring-ApplicationContext from everywhere in your Application

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

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

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

谢谢。

Wouldn't a static singleton instance mean that every user invoking a Struts2 action would be getting business objects from the same ApplicationContext instance?

I'm thinking that a static singleton instance of ApplicationContext would cause the same instance of all business objects to be used by all users / transactions

which would ruin transactions and probably cause locks all over the place.

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

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

如果您的 class 将是原型并且您每次都从 Applicationcontext 获取 Bean 它将是一个新对象