Spring为Bean定义了5种作用域,分别为Singleton(单例)、Prototype(原型)、Request(请求级别)、Session(会话级别)和Global Session(全局会话)。
Singleton
Singleton是单例模式,当实例类型为单例模式时,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,都始终指向同一个Bean对象。该模式在多线程下是不安全的。Singleton作用域是Spring中的默认作用域。
Prototype
Prototype是原型模式,每次通过Spring容器获取Prototype定义的Bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而Singleton全局只有一个对象。因此,对有状态的Bean经常使用Prototype作用域,而对无状态的Bean则使用Singleton作用域。
以上的状态指的是属性
Request
Request指在一次HTTP请求中容器会返回该Bean的同一个实例,而对不同的HTTP请求则会创建新的Bean实例,并且该Bean实例仅在当前HTTP请求内有效,当前HTTP请求结束后,该Bean实例也将会随之被销毁。
Session
Session指在一次HTTP Session中容器会返回该Bean的同一个实例,而对不同的Session请求则会创建新的Bean实例,该Bean实例仅在当前Session内有效。和HTTP请求相同,每一次Session都会创建新的Bean实例,而不同的Bean实例之间不共享数据,且Bean实例仅在自己的Session内有效,请求结束,则Bean实例将随之被销毁。
客户端链接上服务器就算是一次session,关闭浏览器重新连接或者清除cookie可以更换session。注意刷新浏览器是不会更改session的。
Global Session
Global Session指在一个全局的HTTP Session中容器会返回该Bean的同一个实例,且仅在使用Portlet Context时有效。
我理解的这个应用场景是多个服务端公用一个session的场景。
以上摘自 offer来了:Java面试核心只是点精讲 书籍