第四期技术沙龙——浅析SpringMVC工作原理
Posted 我们的开心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第四期技术沙龙——浅析SpringMVC工作原理相关的知识,希望对你有一定的参考价值。
文/梁堃
2017年5月26日,上研应用支持二部第四期技术沙龙活动如约而至。本次沙龙由“小鲜肉”梁堃同学,结合切身的研发经历,分享了纯干货的SpingMVC框架原理,内容精彩充实。
梁堃从什么是SpringMVC出发,结合前端MVC框架、太行平台架构、移动办公系统,指出了MVC这一设计模式在现如今的前台、后台、移动端都是不可或缺的,以此为基础,引出基于MVC的Web层框架SpringMVC,逐步介绍了为什么要使用框架开发、SpringMVC的整体开发流程、SpringMVC内部的调用机制以及SpringMVC涉及的设计模式等纯干货的一些基础知识。
SpringMVC是Spring框架的一个重要组成部分,图中IOC容器是框架的核心(主要用于类成员变量对象的注入工作),AOP面向切面编程,这两个是框架的基础设施,DAO层是Spring对持久层的支持,ORM对象关系映射,JEE是一些企业级的组件,Web层框架中就包含SpringMVC,SpringMVC是一个基于mvc的WEB层框架。
SpringMVC核心类是DispatcherServlet,通过阅读DispatcherServlet源码,可以清晰了解到该核心类继承了HttpServlet。所以要研究SpirngMVC的初始化调用流程就离不开对Servlet生命周期的研究。主讲人根据Servlet生命周期方法并结合SpringMVC源码深入探讨了其初始化调用的init()、initServletBean()、initStrategies()等方法,从而依据initServletBean方法引出了SpringMVC常用的模板设计模式。
主讲人在介绍初始化方法initServletBean()方法时,介绍了该方法在其父类HttpServletBean中是一个没有任何实现的空方法,空方法的目的是留给子类FrameworkServlet去实现自己想要的初始化逻辑,这也就是SpringMVC常用的模板方法设计模式。
设计模式-模板方法:大的逻辑已经确定,程序员要做的就是实现一些具体的步骤,不同的人实现这些步骤的方法也会有所不同,从而模板的行为也会表现出具体的区别。
√Struts2是类级别的拦截,一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。√SpringMVC是管理单例开发的,并且建议使用单例开发,Struts2通过类的成员变量接收参数,无法使用单例,所以只能使用多例。
SpringMVC结合Spring编程时,SpringMVC启动时需要进行组件扫描、url映射以及设置freemarker参数等,为什么要让SpringMVC不扫描带有@Service注解的类,而是由Spring去对@Service注解的类进行扫描?主讲人也给出了答案:因为SpringMVC的配置文件比Spring的配置文件先加载,如果不这样设置,springmvc则将其有带@Service注解的类都扫描到容器中,等到加载Spring的配置文件的时候,会因为容器已经存在Service类,使得spring的cglib不对Service进行代理,导致Spring的配置文件中的事务配置失效,发生异常时,无法进行数据回滚。
本次沙龙在大家热烈的讨论中结束,通过本次沙龙,各位参与者了解了SpringMVC的整体定位、开发流程、工作原理等。与会同事们发散思维讨论了Spring与SpringMVC结合开发过程中关于扫描@Service注解需要注意的问题,对运维人员了解以SpringMVC框架为基础的系统开发流程、开发人员深入研究SpringMVC工作原理具有一定的指导性作用。
主讲人梁堃,2016年加入上海软件研发部应用支持二部支持一组。是个致力于成为全栈人才的“四有”好青年,负责个人网银、超级网银等系统的日常运维工作。他还积极参与到自动化运维工具android端的开发中。
轮值总编:徐佳琦
美编:吴存远
技术支持:孟秋菊
我们的开心 · 总编辑部
(上 研)
以上是关于第四期技术沙龙——浅析SpringMVC工作原理的主要内容,如果未能解决你的问题,请参考以下文章