浅谈springmvc源码:适配器的工作原理

在web开发中引入springmvc中强大的前端控制器,将原来的控制逻辑和模型逻辑进行解耦,既美观,又意图明确,还能增加可复用性。
原来如果不用该模式,控制逻辑和模型逻辑都写在jsp中的话,那么:
1,jsp内容十分混乱,不易看懂。这十分不利于修改维护。
2,jsp转化生成servlet后,jsp内容都到了servlet的service方法中,那么这一个方法里,
既有控制流程的语句,又有模型逻辑语句,还有页面生成的语句,这也太乱了。
本次通过讲解在springmvc中的四大组件,DispatcherServlet,handleMapping,HandlerAdapter,Handle(可以理解为Controller)来讲解springmvc中的适配器
首先,适配器的作用是将一个接口转换成用户希望的另一个接口,适配器模式使接口不兼容的那些类一起工作。具体的关于适配器就不详细讲解,下面我们直接通过DispatcherServlet中的doPatch()方法的源码进行分析(doPatch()方法为dispatcherServlet处理service()方法的本质方法)
在这里插入图片描述在这里插入图片描述

HandlerExecutionChain的类可以被想象成一个"容器",不过为了避免和我们常说的Spring容器中的"容器"混淆,使用"持有者"更合适。这个"持有者"的设计目的就是持有一些东西,这些东西是什么呢?是一个Handler,和一组特定顺序的HandlerInterceptor,在处理请求的时候,DispatcherServlet接收到请求后,根据对应配置文件中配置的处理器映射,找到对应的处理器映射项(HandlerMapping、HandlerExecutionChain),根据配置的映射规则,找到对应的处理器(Handler)和拦截器。在dispatcherservlet中有很多个不同种类的controller类,在经过mappinghandle之后,已经找到了对应的controller,那么为什么已经匹配到了请求对应的Mapping了还要多加一层Handler呢?实际上这跟我们的Controller定义方式有关系。
在SpringMvc中要定义一个Controller有三种方式。

  • 最常见的一种就是通过@Controller注解的方式。

  • 实现Controller接口也可以将一个类定义为Controller

  • 实现Servlet接口定义Controller。

那么这个时候问题就是:如果同时有这么多种实现方式,在DispatchServlet获取到对应的Mapping后如何执行业务方法呢?一种可以想到的方式就是:IF/ELSE的结构,那么以后如果新增了一种Controller的定义方式呢?DispatchServlet的方法就不得不修改,这种实现方式就违背了代码的开闭原则。所以Spring定义了统一的Adapter类,并且为每一种Controller都定义了各自的适配器类,不同的Controller定义只需要获取不同的适配器类即可完成具体方法的调用。
DispatcherServlte会根据handlerMapping传过来的controller与已经注册好了的HandlerAdapter一一匹配,看哪一种HandlerAdapter是支持该controller类型的,如果找到了其中一种HandlerAdapter是支持传过来的controller类型,那么该HandlerAdapter会调用自己的handle方法,handle方法运用java的反射机制执行controller的具体方法来获得ModelAndView,例如SimpleControllerHandlerAdapter是支持实现了controller接口的控制器,如果自己写的控制器实现了controller接口,那么SimpleControllerHandlerAdapter就会去执行自己写控制器中的具体方法来完成请求。

猜你喜欢

转载自blog.csdn.net/qq_52696089/article/details/121204669
今日推荐