Spring ApplicationContext 刷新前的配置
2021-11-04 09:56:19 2 举报
AbstractApplicationContext#refresh() 方法,在正式学习 refresh 方法之前,还有一些刷新前的操作比较重要
作者其他创作
大纲/内容
Tomcat启动项目后会调用该方法
1.从servletContext中解析初始化参数contextClass(web.xml可以配置该参数)
4.遍历实例化后的contextInitializers
ContextLoader#customizeContext
determineContextInitializerClasses
先初始化 AbstractEnvironment,AbstractEnvironment 的构造函数
ContextLoaderListener#contextInitialized 开始 IoC 的构建
7.应用上下文的刷新
获取环境属性
2.解析初始化参数contextInitializerClasses(可在web.xml中配置)
继承ContextLoader进入 ContextLoaderListener#contextInitialized方法之前需要先将 ContextLoader 的成员变量初始化
容器构建启动入口
4.设置wac的configLocations属性值为configLocationParam
1.根据 DEFAULT_STRATEGIES_PATH 和 ContextLoader.class 构建 ClassPathResource。ClassPathResource 的 path 属性可以是绝对路径也可以是相对路径,在这边为相对路径(相对于加载资源的类 ContextLoader),指向的绝对路径为:org.springframework.web.context.ContextLoader.properties。
返回要使用的 WebApplicationContext 实现类,默认 XmlWebApplicationContext 或自定义上下文类(如果指定)
6.自定义上下文
AbstractRefreshableConfigApplicationContext#setConfigLocation
1.从servletContext中解析初始化参数globalInitializerClasses(可在web.xml中配置)
Spring核心流程
// 3.如果没有配置contextClass参数,则从defaultStrategies缓存中拿到默认的WerApplicationContext对应的ClassName,即XmlWebApplicationContext
ContextLoader#configureAndRefreshWebApplicationContext
1.校验WebApplicationContext 是否已经初始化过,如果已经初始化,则抛出异常
创建一个IOC容器,并将创建的IOC容器存到servletContext中
4.使用工具类构建出contextClassName的实例
会新建 StandardServletEnvironment
AbstractRefreshableWebApplicationContext#createEnvironment
web.xml
实例化此加载器的根 WebApplicationContext,默认上下文类或自定义上下文类(如果指定)
2.contextClassName不为空,则使用工具类构建出contextClassName的实例
5.初始化属性源(主要是将servletContextInitParams的占位类替换成sc)
createWebApplicationContext:创建一个 WebApplicationContext 1.确定要创建的应用上下文的Class 2.校验contextClass是否为ConfigurableWebApplicationContext或其子类、子接口 3.实例化contextClass,并强转成ConfigurableWebApplicationContext返回
返回WebApplicationContext
1.确定应用上下文的初始化类
createWebApplicationContext
ContextLoader#determineContextClass
2.如果给定的WebApplicationContext为空 ,创建一个WebApplicationContext并保存到context属性
AbstractRefreshableConfigApplicationContext#resolvePath
ContextLoader
AbstractRefreshableConfigApplicationContext#setConfigLocations
1.如果应用上下文id是原始默认值,则根据相关信息生成一个更有用的
tomcat
ContextLoaderListener#contextInitialized
2.为应用上下文设置servletContextwac.setConfigLocation(configLocationParam);
解析给定路径,必要时用相应的环境属性值替换占位符
参数是 contextConfigLocation,用于指定 Spring 配置文件的路径。
ContextLoader#createWebApplicationContext
使用构造时提供的应用程序上下文为给定的 servlet context初始化 Spring 的 Web appliction context,或者根据“CONTEXT_CLASS_PARAM :contextClass”和“ CONFIG_LOCATION_PARAM contextConfigLocation”上下文参数创建一个新的上下文。
web.xml 中配置 ContextLoaderListener 监听器,当 Tomcat 启动时,会触发 ContextLoaderListener 的 contextInitialized 方法,从而开始 IoC 的构建流程。
2.加载 resource 属性,并赋值给 defaultStrategies。根据 org.springframework.web.context.ContextLoader.properties 路径找到对应的文件,如下图。在这边我们拿到了默认的 WebApplicationContext,即:XmlWebApplicationContext
5.调用initializer的initialize方法,进行自定义初始化wac操作
ContextLoaderListener
0 条评论
下一页