学习主题:源码分析
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
1. Spring源码分析
(1) Spring的运行流程是什么
spring启动时读取Bean配置文件信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系

(2) 写出Spring重要的类和接口以及作用
2. ApplicationContext容器介绍
ApplicationContext内部封装了一个BeanFactory对象,来实现对容器的操作,BeanFactory封装了bean的信息,而ApplicationContext通过访问BeanFactory对象获取bean的对象信息ApplicationContext也实现了一系列的BeanFactory接口(可以说ApplicationContext对BeanFactory对象实现一种代理)
ApplicatonContext在应用这个DefaultListableBeanFactory对象的基础上,不仅实现了BeanFactory接口提供的功能方法,并且黏合了一些面向应用的功能

ClassPathXmlApplicationContext

Refresh() 方法
实例化Bean工厂
DefaultListableBeanFactory
在BeanFactory子类中有一个DefaultListableBeanFactory类.它包含了基本Spring IOC 容器所具有的重要功能,开发时不论是使用BeanFactory系列还是ApplicationContext系列来创建容器基本都会使用到DefaultListableBeanFactory类.可以这么说,在spring中实际上把它当成默认的IOC容器来使用

解析配置文件
XmlBeanDefinitionReader

将BeanDefintion注册到容器中

Bean对象的实例化


分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。
第212次(源码分析)
学习主题:源码分析
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
3. SpringMVC底层源码分析
(1) 写出SpringMVC运行原理

(2) 写出SpringMVC常用类和接口以及作用
1. DispatcherServlet(中央处理器)

2. HttpServletBean
HttpServletBean覆写了init方法,主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中,比如servlet标签的子标签init-param标签中配置的参数

3. ServletConfigPropertyValues
ServletConfigPropertyValues 是 HttpServletBean 的静态内部类。在其构造方法中通过传
递的 ServletConfig 对象对 web.xml 文件中的 DispatcherServlet 节点中的参数进行解析处理。
4. FrameworkServlet
将 Servlet 上下文与 Spring 容器上下文关联。其实也就是初始化 FrameworkServlet 的属
性 webApplicationContext , 这 个 属 性 代 表 SpringMVC 上 下 文 对 象 , 实 际 类 型
ConfigurableWebApplicationContext。如果项目中用到 spring 了那么它有个父容器,既 web.xml
中配置的 ContextLoaderListener 监听器初始化的容器上下文

InitWebApplicationContext() 方法

如果项目中使用 spring 框架,并且在 web.xml 文件中配置了 Listener 来启动 spring。那
么 在 监 听 器 中 spring 会 创 建 WebApplicationContext 容 器 。 此 时 会 将 该 容 器 转 换 为
ConfigurableWebApplicationContext 即 SpringMVC 容器。

如果没有在 web.mxl 文件中配置 Listener 那么此时 webApplicationContext
为 空 则 去 ServletContext 中 根 据 attrname 查 找 。 如 果 为 找 到 , 执 行
createWebApplicationContext 方法来创建 SpringMVC 的容器。
5. refresh();
解析配置文件初始化 SpringMVC 的 IOC 容器环境。
解析 springmvc 配置文件:



6. initStrategies(ApplicationContext context)
初始化SpringMVC其他组件:如多部件解析器,处理器映射器,处理器适配器,视图解析器
HandlerMapping 接口介绍
作用是根据当前请求的找到对应的 Handler(HandlerMethod(Controller 中的方法)、
Controller 对 象 ) , 并 将 Handler 与 一 堆 HandlerInterceptor ( 拦 截 器 ) 封 装 到
HandlerExecutionChain 对象中。在 HandlerMapping 接口的内部只有一个方法:
HandlerExecutionChain getHandler(HttpServletRequest request);
HandlerMapping 接口实现类
HandlerMapping 实现类有两个分支,分别继承自 AbstractHandlerMethodMapping(得
到 HandlerMethod)和 AbstractUrlHandlerMapping(得到 Controller t),它们又统一继承于
AbstractHandlerMapping。

AbstractHandlerMethodMapping
AbstractHandlerMethodMapping 这个分支获取的 Handler 的类型是 HandlerMethod,即 这个 Handler 是一个方法,它保存了方法的信息(如 Method),这样一个 Controller 就可
以处理多个请求了。

上 述 代 码 中 lookupHandlerMethod() 方 法 主 要 工 作 是 在 Map<T, HandlerMethod>
handlerMethods 中找到 HandlerMethod,这里的 T 是 HandlerMappingInfo,它封装了 @RequestMapping 注解中的信息。
HandlerAdapter 接口
SpringMVC 中使用适配器模式来解决不同的 Handler 的执行。根据 Handler 来找到支 持它的 HandlerAdapter,通过 HandlerAdapter 执行这个 Handler 得到 ModelAndView 对 象。
接口中的抽象方法
boolean supports(Object handler); 判断是否支持传入的 Handler
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) 用来使用 Handler 处理请求 long getLastModified(HttpServletRequest request, Object handler); 用 来 获 取 资 料 的 Last-Modified 值

AbstractHandlerMethodAdapter 抽象类
利用 RequestMappingHandlerMapping 获取的 Handler 是 HadnlerMethod 类型,它代 表 Controller 里要执行的方法。handlerInternal 是子类 RequestMappingHandlerAdapter 中的
方法。

RequestMappingHandlerAdapter 类
RequestMappingHandlerAdapter 实际就是执行@RequestMapping 注解的方法
handleInternal 方法 在 handlerInternal 方法中通过调用 invokeHandleMethod 方法执行 HandlerMethod 并返回
一个 ModelAndView。

HttpRequestHandlerAdapter
HttpRequestHandlerAdapter 。 是 HttpRequestHandler 的 适 配 器 可 以 执 行 HttpRequestHandler 类型的 Handler。其实就是 Controller 中的 handleRequest 方法

SimpleControllerHandlerAdapter 类
SimpleControllerHandlerAdapter 是 Controller 实现类的适配器类,其本质也是执行 Controller 中的 handleRequest 方法。

SimpleServletHandlerAdapter 类
SimpleServletHandlerAdapter 其实是一个 Servlet 的适配器,其最终执行的方法是 Servlet 的 service 方法

ViewResolver 接口
根据视图的名称将其解析为 View 类型的视图,如通过 ModelAndView 中的视图名称
将其解析成 View,View 是用来渲染页面的,也就是将 Model 填入模板中,生成 html 或 其他格式的文件。

AbstractCachingViewResolver 抽象类
AbstractCachingViewResolver 是带有缓存的 ViewResolver,它每次解析时先从缓存里查 找,如果找到视图就返回,没有就创建新的视图,且创建新视图的方法由其子类实现。

View 接口
视图渲染器,在该接口中定义了渲染视图的抽象方法。
何为渲染:所谓渲染其实就是将 Model 中的数据放到 HttpServletRequest 中传递 jsp。
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse
response) throws Exception;

分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。