JSF中的应用范围和Spring中的Singleton范围之间的区别


问题内容

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


问题答案:

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

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

Java EE 7教程

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

Spring文档

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

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

无论如何,我认为混合Spring,JSF和DI xml
/注解不是一个好主意。本文详细介绍了如何集成这三种方法(以及如何仅使用一种注释技术就可以使其集成)。

因此,@Named @ApplicationScoped+确保您获得并发权=利润!:)