没有合适的资源?快使用搜索试试~ 我知道了~
SpringMVC源码剖析(三)- DispatcherServlet的初始化流程1
需积分: 0 0 下载量 37 浏览量
2022-08-03
17:03:19
上传
评论
收藏 645KB PDF 举报
温馨提示
试读
11页
声明和设置contextConfigLocation参数,但是将其声明为Resource类型,同样能够成功获取。励读者们继承HttpServletBean写个测
资源详情
资源评论
资源推荐
SpringMVC源码剖析(三)-
DispatcherServlet的初始化流程 - 相见
欢
在我们第⼀次学Servlet编程,学java web的时候,还没有那么多框架。我们
开发⼀个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重
写⼀下doGet,doPost⽅法,跳转到我们定义好的jsp页⾯。Servlet类编写完
之后在web.xml⾥注册这个Servlet类。
除此之外,没有其他了。我们启动web服务器,在浏览器中输⼊地址,就可
以看到浏览器上输出我们写好的页⾯。为了更好的理解上⾯这个过程,你需
要学习关于Servlet⽣命周期的三个阶段,就是所谓的“init-service-destroy”。
以上的知识,我觉得对于你理解SpringMVC的设计思想,已经⾜够了。
SpringMVC当然可以称得上是⼀个复杂的框架,但是同时它又遵循Servlet世
界⾥最简单的法则,那就是“init-service-destroy”。我们要分析SpringMVC的
初始化流程,其实就是分析DispatcherServlet类的init()⽅法,让我们带着这
种单纯的观点,打开DispatcherServlet的源码⼀窥究竟吧。
1.<init-param>配置元素读取
⽤Eclipse IDE打开DispatcherServlet类的源码,ctrl+T看⼀下。
DispatcherServlet类的初始化⼊⼜⽅法init()定义在HttpServletBean这个⽗类
中,HttpServletBean类作为⼀个直接继承于HttpServlet类的类,覆写了
HttpServlet类的init()⽅法,实现了⾃⼰的初始化⾏为。
这⾥的initServletBean()⽅法在HttpServletBean类中是⼀个没有任何实现的空
⽅法,它的⽬的就是留待⼦类实现⾃⼰的初始化逻辑,也就是我们常说的模
板⽅法设计模式。SpringMVC在此⽣动的运⽤了这个模式,init()⽅法就是模
版⽅法模式中的模板⽅法,SpringMVC真正的初始化过程,由⼦类
FrameworkServlet中覆写的initServletBean()⽅法触发。
再看⼀下init()⽅法内被try,catch块包裹的代码,⾥⾯涉及到BeanWrapper,
PropertyValues,ResourceEditor这些Spring内部⾮常底层的类。要深究具体
代码实现上⾯的细节,需要对Spring框架源码具有相当深⼊的了解。我们这
⾥先避繁就简,从代码效果和设计思想上⾯来分析这段try,catch块内的代码
所做的事情:
注册⼀个字符串到资源⽂件的编辑器,让Servlet下⾯的<init-param>配
置元素可以使⽤形如“classpath:”这种⽅式指定SpringMVC框架bean配置
@Override
public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() +
}
// Set bean properties from init parameters.
try {
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
initBeanWrapper(bw);
bw.setPropertyValues(pvs, true);
}
catch (BeansException ex) {
logger.error("Failed to set bean properties on servlet '"
throw ex;
}
// Let subclasses do whatever initialization they like.
initServletBean();
if (logger.isDebugEnabled()) {
logger.debug("Servlet '" + getServletName() + "' configured successfully"
}
}
⽂件的来源。
将web.xml中在DispatcherServlet这个Servlet下⾯的<init-param>配置元
素利⽤JavaBean的⽅式(即通过setter⽅法)读取到DispatcherServlet中
来。
这两点,我想通过下⾯⼀个例⼦来说明⼀下。
我在web.xml中注册的DispatcherServlet配置如下:
可以看到,我注册了⼀个名为contextConfigLocation的<init-param>元素,其
值为“classpath:spring/spring-servlet.xml”,这也是⼤家常常⽤来指定
SpringMVC配置⽂件路径的⽅法。上⾯那段try,catch块包裹的代码发挥的作
⽤,⼀个是将“classpath:spring/spring-servlet.xml”这段字符串转换成classpath
路径下的⼀个资源⽂件,供框架初始化读取配置元素。在我的⼯程中是在
spring⽂件夹下⾯的配置⽂件spring-servlet.xml。
<!-- springMVC配置开始 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-servlet.xml</param-value
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- springMVC配置结束 -->
剩余10页未读,继续阅读
不美的阿美
- 粉丝: 20
- 资源: 292
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Android的学生信息管理2.rar
- 3e9ef566-ba13-47b0-a252-77aa9e4b040f8412130.apk
- 毕业设计基于SSM的房屋租赁系统源【源码+lw+部署+讲解】
- 基于Android男装出口管理系统的app.rar
- 工资表生成工资条Excel模版
- 位运算、状态压缩、枚举子集汇总.html
- C++毕业设计快递分拣机器人系统源码+论文文件+资料.zip
- 锐龙处理器 体质分析工具,体质越好越稳定,越容易超频 tool1007/Win V/F
- IOS Swift3 四种单例模式详解及实例《PPT文档》
- Swin-Unet网络预训练模型,swin-tiny-patch-window7-224.pth
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0