Spring注解中@Scope 的使用解说

案例代码

@Controller
@RequestMapping("/index")
@Scope("prototype")
public class TestControler {
final ThreadLocal<RestBean> local = new ThreadLocal<>();
@Autowired
RestBean bean;



@RequestMapping("/setParam.do")
public void setParam(HttpServletRequest requestInfo){
String parameter = requestInfo.getParameter("id");
// RestBean rr= local.get();
// if(rr == null){
// rr = new RestBean();
// }
System.out.println("SetParamValve--now param is:" + bean.getParam());
bean.setParam(parameter);
// local.set(rr);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(Thread.currentThread().getName()+"GetParamValve--now param is:" + bean.getParam());

}

线程12:SetParamValve--now param is:null
http-bio-8080-exec-12GetParamValve--now param is:fffffffffff

线程3:SetParamValve--now param is:null
http-bio-8080-exec-3GetParamValve--now param is:yyyyy


当设置为prototype时:每次连接请求,都会生成一个bean实例,也会导致一个问题,当请求数越多,性能会降低,因为创建的实例,导致GC频繁,gc时长增加。

设置为单例模式:保证了全局都会有一个实例,对性能有所提高,但是如果实例中有非静态变量时,会导致线程安全问题,共享资源的竞争。


默认是单例模式,即scope="singleton"。另外scope还有prototype、request、session、global session作用域。scope="prototype"多例

@scope默认是单例模式(singleton)

如果需要设置的话@scope("prototype")

1.singleton单例模式,

  全局有且仅有一个实例

2.prototype原型模式,

  每次获取Bean的时候会有一个新的实例

3.request

  request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:
request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:
如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可: 
4.session

  session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效

5.global session

global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。

但是一般常见的话一般会使用上面1和2两种

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值