最近在研究springMVC的源码,推荐一下几个一些学习博客和书籍
推荐书籍《spring 揭秘》:真的写的非常好,从spring IOC、spring AOP、spring orm、spring 事务的支持等等板块对spring做了一个详细的解读。每个模块从架构的由来,组成,使用方法,优化等等方面深入浅出。(强烈推荐)
推荐的博客:
- SpringMVC源码剖析(一)- 从抽象和接口说起
- SpringMVC源码剖析(二)- DispatcherServlet的前世今生
- SpringMVC源码剖析(三)- DispatcherServlet的初始化流程
以上的推荐的书籍、博客配上 源码调试对springMVC源码进行理解,但是我发现对SpringMVC越是深入的了解,越是发现他的复杂性。在设计者对这个框架进行越灵活的配置的同时,其设计结构就越复杂,有一些配置其实在大都数情况下都是默认使用的,例如事务支持,注解支持等等配置文件,所以就产生了Spring Boot。
我们公司也对其进行了简单的改造去除了一些配置,实行了了 约定大于配置的理念。
关键点记录(也是面试会问的问题):
- SpringMVC 需要了解的两个流程:SpringMVC的初始化过程和SpringMVC请求接口的流程。
- spring启动流程web.xml的配置(为什么要这样配置)
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>XXX</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>XXX</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- springMVC是如何把spring容器和Servlet结合在一起的。
- ContextLoaderListener和DispatcherServlet启动时分别会创建WebApplicationContext,并分别会读取
applicationContext.xml
和XXX-servlet.xml
配置文件。两个WebApplicationContext是什么关系,怎么产生的关系 - springMVC的基本组件是那些,在什么时候初始化。
//以下就是MVC重要的组件也是可以扩展的节点
//DispatcherServlet容器refresh完后会触发监听器,使DispatcherServlet进行下面组件初始化
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context); //文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
initLocaleResolver(context); //本地化解析
initThemeResolver(context); //主题解析
initHandlerMappings(context); //通过HandlerMapping,将请求映射到处理器
initHandlerAdapters(context); //通过HandlerAdapter支持多种类型的处理器
initHandlerExceptionResolvers(context); //如果执行过程中遇到异常将交给HandlerExceptionResolver来解析
initRequestToViewNameTranslator(context); //直接解析请求到视图名
initViewResolvers(context); //通过ViewResolver解析逻辑视图名到具体视图实现
initFlashMapManager(context); //flash映射管理器
}
- springMVC请求的简易流程和复杂流程。知道以上组件分别是在哪个环节产生作用。
-
- 比较重要的组件也就是上面的简易流程组件。
HandlerMappings、Handler(主要包括Controller)、ModelAndView、ViewResolver、View
- HandlerMapping 请求和处理类之间的映射关系(HandlerMapping的基本流程详解):不同的HandlerMapping有不同的解析流程
- Handler:次级控制器,Controller是一种Handler的形式,Handler也可以是基于注解或者也可以使用Status框架的Action
- ModelAndView是包含Model页面数据和View的包装类
- ViewResovler 来处理逻辑视图名和View的实现类
- VIew来视图渲染工作
- 次要的组件:
- MultipartResolver用来处理文件上传的
- HandlerAdapter用来处理不同Handler而产生的适配器
- HandlerExceptionResolvers用来处理再Handler过程中产生的异常
- Interceptor 是SpringMVC的拦截器:springMVC之Interceptor拦截器
//Handler(Controller)的配置方法
@Controller
@RequestMapping(value = "/wildcard")
public class TestWildcardController {
@RequestMapping("/test/**")
@ResponseBody
public ModelAndView test1(ModelAndView view) {
view.setViewName("/test/test");
view.addObject("attr", "TestWildcardController -> /test/**");
return view;
}
}
- 常用的 HandlerMappings有哪些,具体每个HandlerMappings是怎么找到想要的Handler
- 常用的HandlerMappings有
SimpleUrlHandlerMapping
,BeanNameUrlHandlerMapping
,RequestMappingHandler
- 特别是注解的HandlerMappings 是如何匹配想要的Handler和Method
(改造)
如何对框架进行改造实现不进行url配置就可以找到对用的Handler。比如在controller/order/orderController目录下不进行RequestMapping配置就可以自动产生对应的url。
- 常用的HandlerMappings有
- 拦截器在哪里切入,相比普通的web拦截器, springMVC的拦截器的不同之处
- 拦截器可以用来进行哪些操作
- springMVC的优点和缺点。
可随时补充。