SpringMVC源码 3.1 DispatchServlet初始化

本文深入剖析了SpringMVC中DispatchServlet的初始化过程。从Servlet生命周期开始,详细讲解了DispatchServlet如何通过init()方法进行配置,包括属性注入、初始化SpringMVC的IoC容器,以及WebApplicationContext的创建和配置。通过对contextConfigLocation等参数的解析,展示了DispatchServlet如何准备并加载SpringMVC的配置文件。
摘要由CSDN通过智能技术生成
SpringMVC源码 3.1 DispatchServlet初始化


上文总结:
前面两篇笔记主要写了ContextLoaderListener在SpringMVC中启动的流程,已经通过ContextLoader完成了对WebApplicationContext(Spring容器)的创建。
还有Spring 在 web.xml中需要的配置相关的东西。
在Spring中,ContextLoaderListener只是一个辅助功能,用于创建WebApplicationContext。而真正的逻辑实现其实是在DispatchServlet中,DispatchServlet是Servlet接口的实现类。

关于Servlet的东西可以参考关于 Servlet XXX的笔记

节选Servlet的总结:
Servlet是运行在java 应用服务器上的程序,不能独立运行,其操作完全由Servlet容器控制。
负责对http请求做相应。根据在web.xml对<servlet>的配置,一个servlet可以映射到一个或者多个请求中。

Servlet的基本信息保存在各自的ServletConfig中,在初始化时由servlet容器通过init()方法传给servlet。

servlet主要负责三件事:
1.读取Servlet容器(tomcat)转发来的request信息。
2.在内部进行逻辑操作。
3.对操作结果写入response中,返回给Servlet容器(tomcat)

servlet的声明周期:
1.实例化(Servlet容器根据在web.xml配置的serlvet进行实例化,并将对应的信息保存在ServletConfig中)
2.初始化(Servlet容器调用init()方法,对其进行初始化)
3.提供服务(Servlet容器接收到请求时,根据映射指到对应的servlet程序,调用service()方法,进行服务)
4.销毁(Servlet容器关闭或者重启时调用destory()方法进行销毁)
5.垃圾回收。
注意:init()、service()、destory()这些都是由Servlet容器进行调用的

Servlet容器为了减少生产Servlet实例的开销,对Servlet采用单例多线程的机制:在servlet的生命周期中,只存在一个实例。Servlet容器的调度线程,从线程池获取一个线程去执行service()方法。在开发过程需要注意线程安全。
对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。

1.DispatchServlet的初始化
通过上面对Servlet的描述中可以了解到,在servlet初始的时候,Servlet容器会调用init方法,所以首先我们需要找到DispatchServlet的init()方法。在父类HttpServletBean中找到了init()方法。
DispatchServlet继承关系:DispatchServlet<-FrameworkServlet<-HttpServletBean<-HttpServlet。前面三个都是spring中的类,HttpServlet是javax Servlet API中的抽象类。

HttpServletBean.init()
@Override
public final void init() throws ServletException {
     if (logger.isDebugEnabled()) {
           logger.debug("Initializing servlet '" + getServletName() + "'");
     }

     // Set bean properties from init parameters.
     try {
            //解析init-param中的参数到PropertyValues对象中
           PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
           //将当前的Servlet(DispatchServlet)类转化为BeanWrapper,从而能够以Spring的方式对init-param的值进行注入
           BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
           ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
           //注册自定义的属性编辑器,一旦遇到Resource类型的属性会使用ResourceEditor记性解析
           bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
            //一个空的方法,留给后续版本
           initBeanWrapper(bw);
            //属性注入
           bw.setPropertyValues(pvs, true);
     }catch (BeansException ex) {
           logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
           throw ex;
     }

     // Let subclasses do whatever initialization they like.
     // FramworkServlet进行了实现,加载DispatchServlet的spring-servletxml文件,初始化SpringMVC IoC容器。
    initServletBean();

     if (logger.isDebugEnabled()) {
           logger.debug("Servlet '" + getServletName() + "' configured successfully");
     }
}

DispatchServlet的参数初始化过程:
1.获取当前Servlet的ServletConfig,将其封装成PropertyValues。也就是web.xml中的<servlet>的<init-param>下的参数。主要的参数是contextConfigL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值