自适应网站建设价格,网站建设需要哪些资料,建站推广,最新移动网站趋势一、Spring框架中的单例Bean是线程安全的吗#xff1f;
【默认单例的情况下】Spring Bean并没有可变的状态#xff08;如Service类和DAO类#xff09;#xff0c;即只能查不能改#xff0c;所以没有并发问题#xff0c;所以某种程度上来说Spring的单例Bean是线程安全的。…一、Spring框架中的单例Bean是线程安全的吗
【默认单例的情况下】Spring Bean并没有可变的状态如Service类和DAO类即只能查不能改所以没有并发问题所以某种程度上来说Spring的单例Bean是线程安全的。 回答
Spring框架中有一个Scope注解默认为单例。因此当Spring的Bean中都是注入无状态的对象没有线程安全问题但如果在Bean中定义了可修改的成员变量如上述的count变量从JVM角度看它本身属于方法区即线程共享的区域中将来多个请求发来多个线程是共享的所以存在问题。
当然如果注册为Bean的字段本身也是可变的【除了Service、DAO等其他的】也存在线程安全问题因为Bean默认为单例的我们可以将其改为多例或者加同步锁。
只要成员变量是不可修改的则这个Bean是线程安全的如果成员变量是可修改的则可能有线程安全问题。
二、SpringMVC的执行流程
前后端分离架构【接口开发、异步】
请求到DisPatcherServlet还有一个过程首先由tomcat的连接器监听到请求处理参数给容器通过映射一级级找到dispatcherServlet
用户发送的请求统一由前端控制器DispatcherServlet统一拦截交给处理器映射器
【负责将请求映射到对应的处理器Controller方法存放在一个map中】
找到了之后将方法名和handler封装为处理器执行链给前端控制器
前端控制器知道了这个请求的方法直接将请求交给处理器适配器【作用是解析参数因为每个请求参数类型不一样有基基本类型、引用类型、路径参数等等…】处理器适配器处理好了参数之后再将请求发给处理器Handler【一般对应的controller都有ResponseBody注解即将返回结果转换为JSON并响应】 处理器执行链包括了哪些东西
处理器对象即具体的 Controller 类中的处理器方法。处理器拦截器Handler Interceptor处理器拦截器可以在处理器方法执行前、执行后或之前和之后执行一些共同的逻辑比如权限验证、日志记录等。处理器方法即处理请求的具体方法。
当请求到达前端控制器DispatcherServlet后前端控制器会通过处理器映射器找到对应的处理器并返回一个处理器执行链包括了以上所述的元素。处理器执行链将负责依次执行处理器拦截器的前置处理、处理器方法的执行以及处理器拦截器的后置处理。 处理器拦截器的作用
处理器拦截器与处理器执行链密切相关处理器执行链中的处理器拦截器可以在请求进入处理器方法之前和处理器方法执行之后实施拦截逻辑。通过处理器拦截器我们可以实现一些通用的逻辑而不需要在每个处理器方法中重复编写。 处理器执行链中包含了处理器对象和处理器方法【包含了具体的执行逻辑】那为什么还要最终交给处理器Handler来执行处理器方法
处理器适配器的作用是将处理器对象Controller转换为处理器Handler的形式然后执行其中的方法以处理请求。处理器适配器知道如何调用不同类型的处理器对象并处理返回值以生成最终的响应给前端控制器。
因此虽然处理器执行链中包含了处理器方法但最终还需要通过调用处理器对象和处理器适配器来执行具体的处理器方法从而完成请求的处理过程。