下边利用tomcat启动spring项目来看看启动过程中发生了什么:
项目启动过程比较长,本想着粘到编辑器中做解析,无奈字数超限,于是转为图片,结果超出长度,不得已做了二次截图才上传成功,项目启动的主要行为大概都截到了,可以参考一下。
总结一下tomcat启动加载顺序:
1.启动tomcat容器catalina,catalina 就是Tomcat服务器使用的 Apache实现的servlet容器的名字
2.容器监听日志打印出当前运行系统环境的tomcat版本号,系统名称以及其他的硬件版本号,以及JDK所在的位置,以及JVM虚拟机的版本号。
3.初始化高并发的APR模式后,随即就会指定tomcat运行的端口号,同时指定ajp-apr的端口号(AJP13是定向包协议。因为性能原因,使用二进制格式来传输可读性文本。),这也是tomcat快要启动起来后看到的端口号。
4.初始化完相应参数后,Catalina服务才算开始正式启动;
5.开始运行tomcat内部核心的标准引擎
6.开始运行Servlet引擎;
7.在容器中初始化log4j;以上可以认为是tomcat在正式工作前开始做的预备工作,发现没有错误后,就可以正式初始化spring容器了,为项目运行做最终准备。
8.开始初始化Spring root
9.优先搜索最基础的配置文件并添加到StandardServletEnvironment中去,如servletConfigInitParams,servletContextInitParams,jndiProperties,systemProperties,systemEnvironment
10.完成添加会打印Initialized StandardServletEnvironment with PropertySources [servletConfigInitParams,servletContextInitParams,jndiProperties,systemProperties,systemEnvironment]
11.由于项目中配置的有servlet,所以tomcat检测到后替换了默认的servlet配置,并刷新了根目录的层级关系。
12.加载系统配置,应该是JDK;初始化完成后会打印出Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]
13.根据web.xml定义的规则查询并加载spring配置,接着加载配置文件中xsd文件并使用编程接口解释器JAXP解析;
14.开始加载Bean
15.加载标签,如 aop - AopNamespaceHandler
c - SimpleConstructorNamespaceHandler
cache - CacheNamespaceHandler
context - ContextNamespaceHandler
jdbc - JdbcNamespaceHandler
jee - JeeNamespaceHandler
jms - JmsNamespaceHandler
lang - LangNamespaceHandler
mvc - MvcNamespaceHandler
oxm - OxmNamespaceHandler
p - SimplePropertyNamespaceHandler
task - TaskNamespaceHandler
tx - TxNamespaceHandler
util - UtilNamespaceHandler
16.解析之前加载到内存applicationContext文件中定义的bean
17.扫描mapper文件,寻找与MySQL配置相匹配的properties文件。
18.spring开始实例化bean,加载Class文件
19.为实现类的目标文件创建动态代理
20.初始化字符过滤器
21.启动成功
关于项目中涉及到的大部分主要关键点,都作了记录。至于英文启动环境及句柄的含义,有心可以对照网上查阅,这里不便展开来说。
总结一下springMVC请求流程:
DispatcherServlet是一个分发器,控制着整个springMVC的流程有序。
①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.
②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收request,然后从HandlerMapping查找处理request的controller.
③:Cntroller处理request,并返回ModelAndView对象,Controller是springmvc中负责处理request的组件(类似于struts2中的Action),ModelAndView是封装结果视图的组件.
④ ⑤ ⑥:视图解析器解析ModelAndView对象并返回对应的视图给客户端.