spring 模式上的作用域有两种
singleton :一个 Spring容器 中只存在公用一个实例。
prototype : 在spring容器中,每次都产生一个新的实例。
值得注意的是,我上面所提到的 “spring容器” 这个单位,每个配置文件都相当于是一个spring容器,在不同的spring容器中即使是 singleton 也是会产生多个实例,但是一个容器中始终都是只有一个实例(实例的是singleton 作用域的情况下)。
控制作用的方法有两种
package controller;import org.springframework.context.annotation.Scope;import service.UserSerivce;/** * 第二种方法 使用 @Scope 注解,使用 prototype 参数声明这个类的作用域的范围是 prototype * 默认情况下是 singleton 的 */@Scope("prototype")public class UserController { public UserSerivce userService; public void setUserService(UserSerivce userService) { this.userService = userService; } }
如何选择Bean的作用域
如果一个bean不会保持任何回话状态(也就是说,他是无状态的),那么应该将他的作用于定义为singleton 。例如我们的controller,service,dao本质上都是无状态的。如果这个有会话状态的话,应该设置成 prototype 作用域,例如我们在使用 struts2 框架式的 action类,使用对象接受前端传递的值,保留有会话信息,应该将其设置成 prototype 作用域。
上面是将的 spring 中所提出的,作用域,在我们的 web 服务器中一样有作用域,而我们的 spring 框架一样可以管理。
request : 一次请求作用域
session:一次会话作用域
application :一个服务器作用域
global session: global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。
上述所说的,作用域也相当于是 一个实例的生命周期。