Spring源码分析之ClassPathXmlApplicationContext

我们在分析Spring源码时,通常会自己创建一个独立的应用上下文,比如本文说的ClassPathXmlApplicationContext。我们在实际开发过程中一般框架内部会初始化一个应用程序上下文,比如springmvc中的XmlWebApplicationContext还有springboot中的AnnotationConfigServletWebServerApplicationContext。

ClassPathXmlApplicationContext 简介

官方文档是这么说的:

Standalone XML application context, taking the context definition files from the class path,
interpreting plain paths as class path resource names that include the package path
(e.g. “mypackage/myresource.txt”). Useful for test harnesses(测试框架) as well as
for application contexts embedded within JARs.

也就是说它可以创建独立应用程序上下文,获取上下文的定义文件等等。它的主要功能如下:

  1. 定义了很多构造函数,只是参数不同,不同的参数具体会影响配置资源的定义和spring应用上下文的刷新(refresh函数)。

  2. 配置资源路径的不同,获取方式的不同。如果设置configLocations参数,那么会通过该类的父类也就是抽象类AbstractRefreshableConfigApplicationContext的resolvePath函数来解析。如果使用带有class参数的构造函数,那么会使用ClassPathResource来获取资源。

AbstractEnvironment

resolvePath函数内部其实是调用AbstractEnvironment的resolveRequiredPlaceholders方法,方法内部会调用propertyResolver它的父类AbstractPropertyResolver的resolveRequiredPlaceholders方法。

1
2
3
4
5
6
7
8

private final ConfigurablePropertyResolver propertyResolver =
new PropertySourcesPropertyResolver(this.propertySources);

@Override
public String resolveRequiredPlaceholders(String text) throws IllegalArgumentException {
return this.propertyResolver.resolveRequiredPlaceholders(text);
}

参考资料:

Spring 中 ClassPathXmlApplicationContext 类的简单使用
彻底搞懂Class.getResource和ClassLoader.getResource的区别和底层原理
SpringMVC加载流程

欢迎关注我的公众号:沉迷Spring
显示 Gitment 评论
0%