标签:lis list res web.xml ali class 这一 逻辑 一件事
//ContextLoaderListener类中的方法,servlet容器在启动的时候会实例化ContextLoaderListener并调用本方法,里面最关键的方法是createWebApplicationContext,逻辑是如果servletContext在配置文件中没有用参数contextClass指定实例化哪一种ApplicationContext,
//那么去ContextLoader类所在的包中的ContextLoader.properties文件中读取org.springframework.web.context.support.XmlWebApplicationContext这个类并实例化,然后servletContext的setAttribute方法,
//把org.springframework.web.context.WebApplicationContext.ROOT做key,实例化的context做value存入。
//注意,在实例化之后,肯定要refresh一次context。这里就会把配置文件全局的那个contextConfigLocation字段的值,作为setConfigLocation的值。所以其实配置的时候,dispatchservlet应该配springmvc.xml,而全局的配置文件中不应该包括springmvc.xml,否则这里面的
bean会被实例化两次,父工厂一个,子工厂一个,当然子工厂有了的话就不会去父工厂找,但是毕竟造成了资源浪费。
//ContextLoaderListener主要就做了这一件事,剩下的事情是DispatcherServlet做的
@Override public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); }
DispatcherServlet从父类的父类HttpServletBean继承(没有重写)了init()方法, 里面主要调用initServletBean(),在父类FrameworkServlet中实现,主要是这两句
this.webApplicationContext = initWebApplicationContext();
把刚才存入servletcontext中的rootContext取出,DispatchServlet,根据servlet规范,是在web.xml中配置,
如果在配置中然后根据构造参数注入单个servlet自己的webApplicationContext,然后把rootcontext设置为parent
如果没有,看contextAttribute参数有没有配置,如果有,实例化这一个。
如果没有,那么DispatchServlet中有一个默认的class名,取出来,自己新建,然后在自己的配置文件中contextConfigLocation这个字段的值setConfigLocation,以后新建的子spring工厂中所有的bean都是从contextConfigLocation这里取。
这三种情况最后都会refresh一次工厂,这个是肯定的。
refresh???
web.xml中springmvc或者说spring的启动方式
标签:lis list res web.xml ali class 这一 逻辑 一件事
原文地址:https://www.cnblogs.com/chuliang/p/9066639.html