SpringMVC和struts2中@Scope("prototype")的使用场景

@scope(“prototype”) 使用场景

  • 有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

  • 无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的

@scope(“prototype”) 使用场景:
有状态的bean使用Prototype作用域
无状态的bean使用singleton作用域。

Springmvc和Struts2拦截机制的区别:

1、Struts2

  • Struts2框架是类级别的拦截,每次请求就会创建一个Action,和Spring整合时Struts2的ActionBean注入作用域是原型模式prototype(否则会出现线程并发问题),然后通过setter,getter吧request数据注入到属性。
  • Struts2中,一个Action对应一个request,response上下文,在接收参数时,可以通过成员变量接收,这说明属性参数是让多个方法共享的。
  • Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了

2、SpringMVC

  • SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。而每个方法同时又和一个url对应,参数的传递是通过@RequestMapping("/login")直接注入到方法中的,是方法所独有的,作用域仅仅是方法体内。
  • 在Spring整合时,SpringMVC的Controller Bean默认单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,因为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

3.性能比较

SpringMVC是基于方法的拦截,加载一次单例模式bean注入。而Struts2是类级别拦截,每次请求需要对应创一个新的Action实例,需要加载所有的属性值注入,因此性能的话SpringMVC高于Struts2。

你可能感兴趣的:(Spring)