springmvc启动流程源码解析
来源:互联网 发布:nginx中文 编辑:程序博客网 时间:2024/05/27 00:33
spring的启动首先会去加载web.xml中的配置我们分析也是从这里开始
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-mvc.xml
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
由于DispacherServlet的父类是FrameworkServlet而FrameworkServlet的父类是HttpServletBean
启动DispacherServlet会调用HttpServletBean中的init方法:
public final void init() throws ServletException {
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
initBeanWrapper(bw);
bw.setPropertyValues(pvs, true);
initServletBean();
}
这里的重点是initServeltBean,它在HttpServletBean中是一个模板方法实现是其子类FrameworkServlet
@Override
protected final void initServletBean() throws ServletException {
this.webApplicationContext = initWebApplicationContext();
initFrameworkServlet();
}
这里重要的是这两句一个是initWebApplicationContext(),再一句是initFrameworkServlet()。initWebApplicationContext()它做的工作就是创建高级IOC容器而InitFrameWorkServlet()则是一个空的方法
具体的实现:
protected WebApplicationContext initWebApplicationContext() {
WebApplicationContext rootContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());
WebApplicationContext wac = null;
if (this.webApplicationContext != null) {
wac = this.webApplicationContext;
if (wac instanceof ConfigurableWebApplicationContext) {
ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) wac;
if (!cwac.isActive()) {
if (cwac.getParent() == null) {
cwac.setParent(rootContext);
}
configureAndRefreshWebApplicationContext(cwac);
}
}
}
if (wac == null) {
wac = findWebApplicationContext();
}
if (wac == null) {
wac = createWebApplicationContext(rootContext);
}
if (!this.refreshEventReceived) {
onRefresh(wac);
}
if (this.publishContext) {
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
}
return wac;
}
到这里就创建了高级的IOC容器了
- springmvc启动流程源码解析
- Activity 启动流程源码解析
- Service 启动流程源码解析
- PackageManagerService启动流程源码解析
- PackageManagerService启动流程源码解析
- spark源码解析-启动流程
- SpringMVC 启动流程及相关源码分析
- SpringMVC执行流程及源码解析
- SpringMVC执行流程及源码解析
- SpringMVC 执行流程及源码解析
- SpringMVC 执行流程及源码解析
- SpringMVC执行流程及源码解析
- SpringMVC学习总结(七).SpringMVC运行流程与源码解析
- SpringMVC源码解析,看SpringMVC的工作流程
- HBase源码解析(一) HMaster启动流程
- Android Zygote启动流程源码解析
- Android SystemServer启动流程源码解析
- Android Launcher启动应用程序流程源码解析
- HDU
- LA 3716
- JVM学习框架及内存结构初略理解
- CentOS7 安装 Virtualenv
- 学习知识复习
- springmvc启动流程源码解析
- Floyd-Warshall算法求矩阵的传递闭包
- 引发的异常:“System.FormatException"
- bootstrap中的样式分类
- Node.js 写入文件流的缓存问题探讨
- git 积累
- NoSQL中的memcached
- Java_基础—File类的概述和构造方法
- Python爬虫-urllib库