本文已参与「新人创作礼」活动,一起开启掘金创作之路。
prototype是原型模式吗?
通过跟踪Spring 创建Bean的源码,在AbstractBeanFactor类的doGetBean方法中可看到,指定scope为prototype时,创建Bean的方式还是根据Bean的定义信息使用createBean方法来创建的,并没有使用clone()方法或序列化的方式创建bean。
原因:(1)克隆时需要实现Cloneable接口并重写clone方法,深克隆要求依赖对象也要实现Cloneable接口,考虑可能出现循环依赖问题,这是难以实现的。(2)使用序列化的形式实现clone也不靠谱,对象序列化存在性能问题,序列化需要实现Serializable接口,类的属性也要支持序列化,条件苛刻。所以所谓的Spring使用原型设计模式来实现prototype只是蹭了个概念而已。
SPRINGMVC 工作原理?
1)客户端发送请求到 DispatcherServlet
2)DispatcherServlet 查询 handlerMapping 找到处理请求的 Controller
3)Controller 调用业务逻辑后,返回 ModelAndView
4)DispatcherServlet 查询 ModelAndView,找到指定视图
5)视图将结果返回到客户端
SPRINGMVC 的执行流程
1) 用户发送请求至前端控制器 DispatcherServlet。 2) DispatcherServlet 收到请求调用 HandlerMapping 映射器。 3) 映射器(根据 xml 配置、注解进行查找)找到可以处理请求的具体的处理器,生成处理器对象以及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。 4) DispatcherServlet 调用 HandlerAdapter 适配器。(DispatcherServlet自己不能调用各种具体的处理器,而是调用适配器,适配器持有各种controller的引用) 5) HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)执行逻辑,执行完成返回 ModelAndView。 7) HandlerAdapter 将执行结果 ModelAndView 返回给 DispatcherServlet。 8) DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器,解析后返回具体 View。 10)DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。 11)DispatcherServlet 响应用户。
注意:
(1)若返回的是json数据,则HandlerAdapter调用处理器执行完逻辑后直接将数据返回给前台,不必再经过视图解析过程。
(2)springmvc自动注册到tomcat,tomcat会将请求都给doDispatch方法(派发请求),具体流程在doDispatch中实现。
拦截器的拦截位置
DispatcherServlet 调用HandlerAdapter前后各做一次拦截。
视图解析后传递给DispatcherServlet 前拦截一次。