web.xml配置一个ContextLoaderListener监听,实现了servletContext类的监听器ServletContextListener 继承了contextLoader类,在监听到servletContext被创建时执行contextInitialized方法
在这个方法中contextLoaderListener将启动spring容器,初始化bean的工作委派给了他的父类ContextLoader类来执行
这里设计到servletContext监听的内容,可以参考博文学习https://blog.csdn.net/qq_15204179/article/details/82055448
内容加载器ContextLoader创建了spring容器,初始化完内容后将WebApplicationContext实现类对象存到servletContext域中,key为WebApplicationContext的全限定名.ROOT
WebApplicationContext这里的实现类是 ConfigurableWebApplicationContext
然后ContextLoader调用configureAndRefreshWebApplicationContext方法
在这里从servletContext中取出名为contextConfigLocation的 spring 配置,所以contextConfigLocation的spring配置名是写死的
然后调用 XmlWebApplicationContext 的超级父类 AbstractRefreshableConfigApplicationContext 的setConfigLocations 方法加载配置文件位置configLocations
然后调用AbstractApplicationContext refresh() 方法初始化bean,这里完成了所有bean初始化准备和实例化的工作
这里跟下去就会发现他为每一个bean都创建了一个RootBeanDefinition 初始化,梳理对象关系,参数赋值等
具体创建过程可以参考这篇文章:https://blog.csdn.net/qq_42394457/article/details/88629022
dispatcherServelt extends frameworkServlet (extends httpServletbean(extends HttpServlet(extends GenericServlet(implements Servlet, ServletConfig, java.io.Serializable)) implements EnvironmentCapable, EnvironmentAware))
其中设计到servletConnfig 和servletContext的概念
web容器会根据配置文件中的
web容器会为每个应用分配一个servletContext对象,用来代表当前web应用,这个servletContext实例是被这个应用的所有servlet共享的,而且在创建每个servletConfig时都会封装一个servletContext的引用进去。可以通过servletConnfig .getServletContext()方法获得。
servlet为我们提供了两个init方法,httpServletBean只需要实现无参方法,并且被final修饰了,他的子类不能再重写该方法,,有参方法在GenericServlet中已经实现了
private transient (不用被序列化的)ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
——————————————————————————————————————————————————————————————————————————————————————
学习方法推荐:使用idea跟源码很方便,建议可以先制造几个错误,看看抛异常的堆栈信息,然后断点调试