springmvc-ContextLoaderListener初始化
2023-08-15 21:11:51 8 举报
ContextLoaderListener加载springmvc中初始化父容器的过程
作者其他创作
大纲/内容
对spring容器和web容器的一种参数自定义的扩展,预留了接口,一般不用
结束
把创建好的IOC容器放到Serverlet容器中
和之前分析的spring源码一样
静态代码初始化数据
内部
这个是那个默认配置文件的内容,要注意是这个是XmlWebApplicationContext
设置父容器这些概念不太熟悉
this.initWebApplicationContext(event.getServletContext());
读取web.xml配置信息contextConfigLocation元素,
static { try { ClassPathResource resource = new ClassPathResource(\"ContextLoader.properties\
org.springframework.web.context.WebApplicationContext=org.springframework.web.context.support.XmlWebApplicationContext
WebApplicationContext 是一个接口,相对路径就是上面定义的这个路径, 上面的配置文件就是指定了一个这个接口的实现类,默认可以使用这个
initPropertySources()调用初始化上下文属性的方法
contextClassName = defaultStrategies.getProperty(WebApplicationContext.class.getName());
先通过上下文中获取web.xml配置参数contextClass的值
DispatcherServlet
spring老项目这个配置是约定必须配置的 <!-- 配置监听器 Spring 配置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
直接实例化,我感觉这个而是一个留给别的方式扩展的点
判断参数是否获取到
如果没配置默认是/WEB-INF/applicationContext.xml或者/WEB-INF/+namespace+.xml
这个具体分析在别的文章有写,这里不展开写了,下面是其中一个小重点,关于获取配置文件的
ContextLoaderListener:注册在web.xml中,web应用启动时,会创建它,并回调它的initWebApplicationContext()方法,从而创建并启动spring容器。必须继承ServletContextListener。WebApplicationContext:用于web应用的spring容器上下文,它代表了spring容器,继承自ApplicationContext。是一个接口,在ContextLoader.properties配置文件中可以声明它的实现类。默认实现类为XmlWebApplicationContext。ApplicationContext继承自BeanFactory,并扩展了它的很多功能。ServletContext:web容器(如tomcat)的上下文,不要和ApplicationContext搞混了。
org.springframework.web.context.support.XmlWebApplicationContext#getDefaultConfigLocations
wac.refresh();
调用抽象父类的方法AbstractApplicationContext()这个和之前的容器的初始化的流程衔接上了。基本上一样
this.context = this.createWebApplicationContext(servletContext);思考:其它的容器肯定有自定义的方式
放到map中名为currentContextPerThread
configureAndRefreshWebApplicationContext加载spring配置文件,创建beans
Class<?> contextClass = this.determineContextClass(sc);
依据上面
内部代码
是
前言:spring IOC容器的初始化,是被web容器 比如最常见的tomcat容器调用的主要是通过监听模式来实现font color=\"#4d4d4d\
contextConfigLocation
否
tomcat会回调这个监听器的方法
判断容器是不是已经存在WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTEorg.springframework.web.context.WebApplicationContext.ROOT
contextInitialized()
configureAndRefreshWebApplicationContext方法中会解析自定义的配置文件路径(如果配置了contextConfigLocation属性),而在后续loadBeanDefinitions加载bean定义的方法中将会调用getConfigLocations方法获取配置文件路径。 如果配置了contextConfigLocation属性,那么就是根据该属性的值指定的配置文件路径来初始化。 如果没有配置该属性,那么就会调用getDefaultConfigLocations方法获取默认路径:对于Root WebApplicationContext,默认路径为\"/WEB-INF/applicationContext.xml\"。对于DispatcherServlet绑定的子WebApplicationContext,默认路径为\"/WEB-INF/\"+容器nameSpace+ \".xml\"。Root容器没有nameSpace(为null),MVC子容器则拥有。DispatcherServlet对应的子容器的nameSpace就等于DispatcherServlet的namespace,可以通过设置Servlet的nameSpace属性手动指定名称空间,如未指定,那么默认名称空间为servletName+\"-servlet\",即如果此servlet的servlet-name为\"test\",则该servlet使用的默认名称空间将解析为\"test-servlet\"。如果也未指定该Servlet的contextConfigLocation属性,那么最终的默认配置路径就是\"/WEB-INF/test-servlet.xml\"。
各种开始入口
和这个父类同级的目录下有ContextLoader.properties
内容
调用父类 ContextLoader的初始化方法
依据这个数据
这个地方还是和spring的初始化流程差不多,只是有所扩展
得到font color=\"#ec7270\
见源码图片
ContextLoaderListener extends ContextLoader implements ServletContextListener
DispatcherServlet对应的容器的nameSpace就等于DispatcherServlet的namespace,可以通过设置Servlet的nameSpace属性手动指定名称空间,如未指定,那么默认名称空间为servletName+\"-servlet\",即如果此servlet的servlet-name为\"test\",则该servlet使用的默认名称空间将解析为\"test-servlet\"。如果也未指定该Servlet的contextConfigLocation属性,那么最终的默认配置路径就是\"/WEB-INF/test-servlet.xml\"。
0 条评论
下一页