我试图将使用CURAM编写的应用程序移植到Struts2项目中。我们正在使用Spring来利用其数据库事务功能。对应用程序代码在CURAM应用程序中编写的方式,我不能使用Spring的依赖注入功能。我需要能够从业务逻辑中的任何位置访问Spring ApplicationContext。每当我需要它的时候创建一个新的ApplicationContext实例就会把事情搞得一团糟。
我在互联网上找到了这个资源,它向您展示了如何创建Spring的ApplicationContext的静态单例实例。
Access the Spring-ApplicationContext from everywhere in your Application
这可以解决我的问题,但我有疑虑。不是一个静态单例实例意味着调用Struts2操作的每个用户都将从同一个ApplicationContext实例获取业务对象吗?
默认情况下,Spring bean是ApplicationContext实例中的单例。因此,我认为ApplicationContext的静态单例实例会导致所有用户/事务使用所有业务对象的相同实例,这会破坏事务并可能导致整个地方发生锁定。我假设这是正确的吗?
如果我宣布所有的Spring Beans都是原型怎么办?这是否允许我在使用ApplicationContext的静态单例实例时利用Springs Database Transaction / Concurrency Handling功能?
感谢。
答案 0 :(得分:3)
不是静态单例实例意味着每个调用Struts2操作的用户都会从同一个ApplicationContext实例获取业务对象吗?
是
我认为ApplicationContext的静态单例实例会导致所有用户/事务使用所有业务对象的同一实例
是
会破坏交易并可能导致整个地方发生锁定。
没有。为什么会破坏交易?为什么会有锁?商业服务通常是完全无国籍的,因此作为一个单身人士很好。典型的Spring应用程序只有一个应用程序上下文,包含单例bean。它是如何设计的。事务上下文不存储在业务对象中。它存储在ThreadLocal中。
答案 1 :(得分:0)
如果你创建一个没有公共变量的类,使用siglton它将是最好的选择。你可以@Autowired必要的сlass喜欢Dao或服务类
如果你的类是原型,你每次从Applicationcontext获取Bean都是一个新对象