Bean的singleton、prototype、request 、 session 和 globalsession五种作用域中,request 、 session 和 globalsession三种作用域仅在基于 Web 的应用中使用。
一般在 标签中通过 scope 指定作用域类型,也可以在 下指定默认全局的 scope 类型。
其中 Singleton 与 Prototype 类型的区别在于:Prototype 在交给用户后,IOC 容器不在具有管理权限,即放弃对该 bean 的生命周期管理。而 IOC 容器则会对 Singleton 进行完整的生命周期管理;Singleton 默认采用非延迟初始化,也可通过设置 lazy-init 属性改变初始化方式,但是 prototype 只能采用延迟初始化方式。
Request作用域
考虑下面bean定义:
针对每次HTTP请求,Spring容器会根据loginAction bean定义创建一个全新的LoginAction bean实例, 且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态, 而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。 当处理请求结束,request作用域的bean实例将被销毁。
简单的说,
scope=”request”
每次HTTP请求,Spring容器会根据所对应类创建一个全新的bean实例。这个对象实例只在当前request中有效。
Session作用域
考虑下面bean定义:
针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例, 且该userPreferences bean仅在当前HTTP Session内有效。 与request作用域一样,你可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例, 将不会看到这些特定于某个HTTP Session的状态变化。 当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。
简单的说,
scope=”session”
每次HTTP session,Spring容器会根据所对应类创建一个全新的bean实例。这个对象实例只在当前HTTP session中有效。
global session作用域
考虑下面bean定义:
global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
请注意,假如你在编写一个标准的基于Servlet的web应用,并且定义了一个或多个具有global session作用域的bean,系统会使用标准的HTTP Session作用域,并且不会引起任何错误。
简单的说,
scope=”globalSession”
global session类似于HTTP Session作用域,它只有对portlet才有意义。对于Servlet的web应用就相当于session。