版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yueloveme/article/details/89643980
推荐博客
给大家推荐个靠谱的公众号程序员探索之路,大家一起加油
引言
之前有一篇文章介绍了DispatcherServlet初始的时候做了哪些事情,接下来会把每一步做的事情细化来说,这篇介绍HttpServletBean
上一篇
Spring MVC源码分析(一)-----DispatcherServlet完成的工作
https://mp.csdn.net/mdeditor/89320043#
正文
init方法
HttpServletBean没有太复杂的功能主要函数是init方法中
@Override
public final void init() throws ServletException {
if (logger.isDebugEnabled()) {
logger.debug("Initializing servlet '" + getServletName() + "'");
}
// Set bean properties from init parameters.
try {
获取web.xml中的contextCofigLocation配置属性,就是SpringMVC的配置文件
如果没有就是PropertyValues数组长度为0,自己可以构建一个空的springboot项目debug一下
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);
将配置的初始化值设置到DispatcherServlet中
bw.setPropertyValues(pvs, true);
}
catch (BeansException ex) {
if (logger.isErrorEnabled()) {
logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
}
throw ex;
}
// Let subclasses do whatever initialization they like.
这个是模板方法由 子类FrameworkServlet实现
initServletBean();
if (logger.isDebugEnabled()) {
logger.debug("Servlet '" + getServletName() + "' configured successfully");
}
}
getServletName
/**
* Overridden method that simply returns {@code null} when no
* ServletConfig set yet.
* @see #getServletConfig()
*/
获取servletname
@Override
public final String getServletName() {
return (getServletConfig() != null ? getServletConfig().getServletName() : null);
}
getServletContext
/**
* Overridden method that simply returns {@code null} when no
* ServletConfig set yet.
* @see #getServletConfig()
*/
获取servletcontext
@Override
public final ServletContext getServletContext() {
return (getServletConfig() != null ? getServletConfig().getServletContext() : null);
}
注意
debug时会发现在项目启动的时候是不会进行SpringMVC的一系列初始化的,第一次请求的时候会触发
spring版本不同代码结构会略有不一样(版本相差不大的时候)