Spring Singleton,请求,会话Bean和线程安全

由众多有用框架组成的Spring框架生态系统已成为许多Java EE应用程序的基础。 但是在所有Spring产品的核心中,我们仍然拥有Spring DI / IOC框架,该框架将Spring推向了新的高度。

随着越来越多的人将Spring MVC或JSF-Spring集成用于他们的应用程序,除了更传统的Singleton和Prototype范围之外,Spring Bean现在更频繁地用于请求/会话范围。

刚开始使用各种Spring范围的开发人员最初的好奇心之一是,这些范围在Web应用程序中以及在需要编写安全的并发代码的情况下的行为方式。 好吧,这个“否”的答案就是要对这些范围进行过度考虑,因为它们的行为与命名方式完全相同。 让我们以JSF-Spring集成为例,其中所有JSF bean都由Spring IOC容器加载,并且bean的作用域也使用假定的Spring的@Scope注释定义。

具有@Scope(“ request”)的bean可以在任何新的传入请求中创建,因此可以保证它的线程安全,因为它是在每次有新请求进入时创建的。接下来是@Scope(“ session”) bean,对于在用户的每个会话中,如果用户通过浏览器的多个选项卡访问应用程序,则该bean范围肯定会出现并发问题,因此对于开发人员而言,确保共享会话数据的状态不会损坏很重要。

现在是@Scope(“ singleton”)或Spring Bean的默认范围,这些单例Bean在繁重的Web应用程序中的行为如何。 首先,重要的是要了解“ Singleton”仅意味着一个实例,即应用程序将仅具有该bean的一个实例。 现在,Spring框架对于这个Singleton bean的多线程行为并没有做任何事情 ,即它只是一个普通的Singleton bean,并且由开发人员来处理与该bean有关的并发问题。

现在出现了一个问题,Web应用程序中应将哪种bean用作Singleton ,答案很简单: 任何没有STATE的Bean都可以是singleton 。 例如,可以轻松地成为单例的bean是DAOServiceController这些控制器没有自己的状态,而是我们在应用程序中利用这些bean执行某些操作。DAO层bean可以是单例,因为它们没有具有各自的状态,但是每个线程使用DAO bean进行访问以执行特定于线程的操作,因此DAO bean不受其自身并发访问的影响,因为它没有其自身的状态。

选择Singleton bean的一个非常糟糕的例子是需要维护其状态的bean,在这种情况下,每个线程都会尝试通过破坏数据将自己的状态强加到该bean上。 例如,如果将具有名称和年龄的设置器和获取器的Person bean设为单例。 现在,如果有多个线程开始访问此bean,它们将继续覆盖Person实例的最后一个设置值,从而破坏状态。

结论–请记住黄金法则: 仅选择那些没有状态的bean作为单例

参考:来自我们JCG合作伙伴 Tarun Sapra的Spring Singleton,请求,会话Bean和线程安全 ,在“ Java Enterprise Ecosystem”博客上

相关文章 :


翻译自: https://www.javacodegeeks.com/2011/11/spring-singleton-request-session-beans.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值