springmvc线程安全(Springmvc中在controller注入request会有线程安全问题吗) 您所在的位置:网站首页 springmvc接收参数 springmvc线程安全(Springmvc中在controller注入request会有线程安全问题吗)

springmvc线程安全(Springmvc中在controller注入request会有线程安全问题吗)

2023-03-21 18:37| 来源: 网络整理| 查看: 265

本文目录Springmvc中在controller注入request会有线程安全问题吗Spring MVC的Controller是线程安全的么个人对于spring mvc框架的理解springmvc是线程安全的吗Spring的MVC相比Structs2有什么优点呢Spring MVC的Controller是线程安全的么Spring MVC的Controller是线程安全的么SpringMVC的Controller线程安全吗spring mvc 单例是怎么保证线程安全的Springmvc中在controller注入request会有线程安全问题吗Springmvc中在controller注入request会有线程安全问题吗

直接在Controller的成员变量上使用@Autowire声明HttpServletRequest,这是线程安全的!@Controllerpublic class TestController{@AutowireHttpServletRequest request;@RequestMapping(“/“)public void test(){request.getAttribute(“uid“);}

Spring MVC的Controller是线程安全的么

默认线程不安全。Spring MVC默认注册bean都是单例模式,即:@Scope(“singleton“),所有线程调用的都是同一个实例对象,所以线程不安全。不过可以手动指定javabean的scope为多例,即:@Scope(“prototype“),每个线程调用都会重新实例化一个对象,这样就线程安全了。123456@Controller@Scope(“prototype“)@RequestMapping(“/user“)public class UserController {// ...}

个人对于spring mvc框架的理解

以下我的个人理解加上网络上的所查阅资料,对于spring mvc框架的一些总结,不足之处还望指出

    在web模型中,MVC是一种很流行的框架,通过把Model,View,Controller分离,把较为复杂的web应用分成逻辑清晰的几部分,是为了简化开发,减少出错,同时也为了组内开发人员之间的配合。总之就是一种分层工作的办法。

(1) 用户通过浏览器向服务器发送请求,请求被springmvc的前端控制器DispatcherServlet拦截;

(2) DispatcherServlet拦截到请求后,会调用HandlerMapping处理映射器;

(3) 处理器映射器根据请求URL找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给调用处理器DispatcherServlet;

(4)DispatcherServlet会通过返回信息选择合适的HanderAdapter(处理器适配器);

(5)HanderAdapter会调用并执行Handler(处理器),这里的处理器值的就是程序中编写的Controller类,也被称之为后端控制器;

(6)Controller执行完成后,会返回一个ModelAndView对象,该对象中包含视图名或包含模型和视图名

(7)HandlerAdapter将ModelAndView对象返回给DispatcherServlet;

(8)DispatcherServlet会根据ModelAndView对象选择一个合适的ViewReslover(视图解析器)

(9)ViewReslover解析后,会向DispatcherServlet中返回具体的View

(10)DispatcherServlet对view进行渲染(即将模型数据填充至视图中)

(11)视图渲染结果会返回给客户端浏览器显示

(1)DispatcherServlet接口:Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。

(2)HandlerMapping接口:能够完成客户请求到Controller映射。

(3)Controller接口:需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。

从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。

(4)ViewResolver接口:Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。

    是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:

(1)截获符合特定格式的URL请求。

(2)初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。

(3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。

springmvc是线程安全的吗

不是,springmvc默认是单例模式,所以避免使用成员变量其实是不是线程安全并不重要,要想让不安全的场景发生,需要你主动去创造条件,只要别这么干就没事

Spring的MVC相比Structs2有什么优点呢

1:spring3开发效率高于struts2:spring3 mvc可以认为已经100%零配置3:struts2是类级别的拦截, 一个类对应一个request上下文,springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应所以说从架构本身上 spring3 mvc就容易实现restful url 而struts2的架构实现起来要费劲因为struts2 action的一个方法可以对应一个url而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了 4:spring3mvc的方法之间基本上独立的,独享request response数据请求数据通过参数获取,处理结果通过ModelMap交回给框架方法之间不共享变量而struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的这不会影响程序运行,却给我们编码 读程序时带来麻烦 5:由于Struts2需要针对每个Request进行封装,把Request,Session等Servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全。所以在原则上,是比较耗费内存的

Spring MVC的Controller是线程安全的么

线程不安全,Spring MVC默认是单例模式,Controller、Service、Dao都是单例所以在使用不当存在一定的安全隐患。Controller单例模式的好处在与: 1. 提高性能,不用每次创建Controller实例,减少了对象创建和垃圾收集的时间 2. 没多例的必要 由于只有一个Controller的实例,当多个线程同时调用它的时候,它的成员变量就不是线程安全的

Spring MVC的Controller是线程安全的么

SpringMVC 是基于单例模式的,所以如果有类的实例全局变量,这个会出现问题。但是根据SpringMVC的设计要求,不推荐存在全局变量,出现的类引用也不过是Service层中的对象,这个对象不具备保存请求数据信息的功能,如果有保存信息也直接传入了函数内部。函数内部定义的变量时线程安全的。所以应该是可以放心使用的。SpringMVC和Sturts2设计的不同是请求的信息是否保存才Controller层中。Struts2的Action是需要保存请求信息的。而SpringMVC是不保存的。所以Struts2是用prototype,SpringMVC是singleton。整体来说,SpringMVC的Controller是线程不安全的,但是对设计有规定要求,这样可以避免线程安全问题。不只是Controller,包括Service和Dao都是不安全的。

SpringMVC的Controller线程安全吗

SpringMVC的Controller线程不安全,因为 Controller默认情况下是Singleton(单例)的。 如和避免线程安全问题?有两种常用方式:

spring mvc 单例是怎么保证线程安全的

参考如下内容,讲的很好,可以配置controller为单例模式,每次都新建一个:SpringMVC和Struts2中是并发访问否会存在线程安全问题。对于使用过SpringMVC和Struts2的人来说,大家都知道SpringMVC是基于方法的拦截,而Struts2是基于类的拦截。对于Struts2来说,因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;而Spring的controller默认是Singleton的,这意味着每一个request过来,系统都会用原有的instance去处理,这样导致两个结果:一是我们不用每次创建Controller,二是减少了对象创建和垃圾收集的时间;由于只有一个Controller的instance,当多个线程调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。 如: view plain copy print?public class Controller extends AbstractCommandController { protected Company company; protected ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object command,BindException errors) throws Exception { company = ................; } } 解决方案:有几种解决方法:1、在Controller中使用ThreadLocal变量2、在spring配置文件Controller中声明 scope=“prototype“,每次都创建新的controller所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。

Springmvc中在controller注入request会有线程安全问题吗

servlet是单例的,而tomcat则是在多个线程中调用servlet的处理方法。因此如果servlet存在实例对象,那么就会引出线程安全的问题。而springmvc允许在controller类中通过@Autowired配置request、response以及requestcontext等实例对象。这种配置方法是否线程安全?答案是——这种配置方法是线程安全的,request、response以及requestcontext在使用时不需要进行同步。而根据spring的默认规则,controller对于beanfactory而言是单例的。即controller只有一个,controller中的request等实例对象也只有一个。然而tomcat依旧会以多线程的方式访问controller。这种做法似乎并不能保证线程安全。我们如何理解这一矛盾?在解释controller线程安全这一问题之前需要首先了解如下的一些问题和概念:1.servlet的request域的问题:request域是javapublic class ThreadLocalTest { public static ThreadLocal《HttpRequest》 local=new ThreadLocal《HttpRequest》(); public static void set(HttpRequest f){ if(get()==null){ System.out.println(“ThreadLocal is null“); local.set(f); } } public static HttpRequest get(){ return local.get(); } } Factory类:该类是一个工厂类并且是单例模式,主要负责向ThreadLocalTest对象中设置和获取对象public class Factory{ private static Factory factory=new Factory(); private Factory(){ } public static Factory getInstance(){ return factory; } public HttpRequest getObject(){ return (HttpRequest)ThreadLocalTest.get(); } public void setObject(HttpRequest request){ ThreadLocalTest.set(request); } } Delegate类:该类实现了InvocationHandler接口,并实现了invoke方法import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Delegate implements InvocationHandler{ private Factory factory; public Factory getFactory() { return factory; } public void setFactory(Factory factory) { this.factory = factory; } @Override public Object invoke(Object proxy, Method method, Object args) throws Throwable { return method.invoke(this.factory.getObject(), args); } }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有