【问题标题】:Difference between Application Scope in JSF and Singleton Scope in SpringJSF 中的 Application Scope 和 Spring 中的 Singleton Scope 的区别
【发布时间】:2013-10-18 18:42:59
【问题描述】:

任何人都可以对 ApplicationScope(JSF) 和 Singleton(Spring MVC) 之间的区别有所了解。我有一个用 jsf 编写的应用程序,其中一个类使用应用程序范围。在转换为 spring 时,我使用了 Singleton 范围,我认为它与 Application 范围稍等价。但是想深入了解两者在性能等方面的实际差异。

【问题讨论】:

    标签: spring-mvc jsf-2


    【解决方案1】:

    两者在某种意义上是相似的,一旦启动,它们将一直存在,直到应用程序结束(或者该类被垃圾收集,在典型的 Java EE 应用程序中直到您取消部署才会发生这种情况)。

    • 两者都是共享实例,您应该确保它们是线程安全的。

    来自Java EE 7 Tutorial

    @ApplicationScoped 所有用户与 Web 应用程序交互的共享状态。

    来自Spring Documentation

    Spring 的单例 bean 概念不同于四人组 (GoF) 模式书中定义的单例模式。 GoF Singleton 对对象的范围进行硬编码,以便每个 ClassLoader 创建一个且仅一个特定类的实例。 Spring 单例的范围最好按照每个容器和每个 bean 来描述。这意味着,如果您在单个 Spring 容器中为特定类定义一个 bean,则 Spring 容器会创建该 bean 定义的类的一个且只有一个实例。

    因此,除非您使用后端单例 bean 来服务多个 Web 应用程序(例如在具有多个 Web 项目的 EAR 项目中 - 在这种情况下,如果您停止/取消部署,单例 Bean 可能会比应用程序 bean 寿命更长Web 应用程序而不是 EAR)或在您的 Web 应用程序仍在运行的情况下破坏您的 Spring 应用程序上下文(在这种情况下,您的 Application Bean 可能比您的 Singleton Bean 寿命更长)这两个生命周期非常相似。

    无论如何,我认为混合 Spring、JSF 和 DI xml/注解并不是一个好主意。 This article 详细介绍了如何将这三者集成(以及如何以一种您只能使用其中一种技术进行注释的方式进行整合)。

    所以,@Named @ApplicationScoped + 确保您获得正确的并发性 = 利润! :)

    【讨论】:

    • 我正在使用 JSf2 和 Spring-Webflow,到目前为止看起来很不错。
    • 对于单例作用域,一次只能有一个对象使用该bean,当有多个不同会话的并发对象要使用它时,会不会导致性能问题?
    • 是的(尽管我在工作之余离开了 Spring 并发现了 Play 2 和 Wicket 的乐趣......如果可以的话,我会忘记 JSF / ADF)。关于单身人士,是和否。这完全是关于如何管理并发(锁、同步、原子和东西)。单例模式和作用域已被严重滥用(实际上,java static 已被严重滥用)......我的意思是,作用域本身并不慢,是你用它做什么可能会或可能不会产生性能开销(我将订购一件 T 恤:单例不会杀死并发,糟糕的代码会杀死并发)
    • 另外,请确保您了解 Spring 不会 guarantee that only one object can use the bean at a time 这取决于您。此外,您必须处理/同步的状态越少越好。看看这个very interesting post
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多