1.启动测试代码:
ApplicationContext ac = new ClassPathXmlApplicationContext("spring-${username}.xml");
进入到: 下面的是为了解决启动过程中的bug的忽略
static {
急切地加载 ContextClosedEvent 类以避免在 WebLogic 8.1 中的应用程序关闭时出现奇怪的类加载器问题
ContextClosedEvent.class.getName();
}
进入到本篇的主角:
使用给定的父级创建一个新的 ClassPathXmlApplicationContext,从给定的 XML 文件加载定义。
参数:
configLocations – 资源位置数组
refresh – 是否自动刷新上下文,加载所有 bean 定义并创建所有单例。 或者,在进一步配置上下文后手动调用 refresh。
parent – 父上下文
抛出:
BeansException - 如果上下文创建失败
也可以看看:
refresh()
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
super(parent); //本篇详细解析此方法
setConfigLocations(configLocations);
if (refresh) {
refresh();
}
}
开启多层套娃模式:
ClassPathXmlApplicationContext->AbstractXmlApplicationContext(ApplicationContext实现的便捷基类)->AbstractRefreshableConfigApplicationContext->AbstractRefreshableApplicationContext->AbstractApplicationContext
类介绍:
AbstractRefreshableConfigApplicationContext:
AbstractRefreshableApplicationContext子类,用于添加对指定配置位置的通用处理。 用作基于 XML 的应用程序上下文实现的基类,例如ClassPathXmlApplicationContext和FileSystemXmlApplicationContext ,以及org.springframework.web.context.support.XmlWebApplicationContext 。
AbstractRefreshableApplicationContext
ApplicationContext实现的基类应该支持对refresh()多次调用,每次都创建一个新的内部 bean 工厂实例。 通常(但不一定),这样的上下文将由一组配置位置驱动,以从中加载 bean 定义。
AbstractApplicationContext:
ApplicationContext接口的抽象实现。 不强制要求用于配置的存储类型; 简单地实现常见的上下文功能。 使用模板方法设计模式,需要具体的子类来实现抽象方法。
与普通 BeanFactory 相比,ApplicationContext 应该检测在其内部 bean 工厂中定义的特殊 bean:因此,此类自动注册BeanFactoryPostProcessors 、 BeanPostProcessors和ApplicationListeners ,它们在上下文中定义为 bean。
MessageSource也可以作为上下文中的 bean 提供,名称为“messageSource”; 否则,消息解析将委托给父上下文。 此外,应用程序事件的多播器可以在上下文中作为ApplicationEventMulticaster类型的“applicationEventMulticaster”bean 提供; 否则,将使用SimpleApplicationEventMulticaster类型的默认多播器。
通过扩展DefaultResourceLoader实现资源加载。 因此,将非 URL 资源路径视为类路径资源(支持包含包路径的完整类路径资源名称,例如“mypackage/myresource.dat”),除非在子类中重写了getResourceByPath方法。
然后我们看下这个类的结构:

最后到了这个类:
//使用给定的父上下文创建一个新的 AbstractApplicationContext。
参数:
parent – 父上下文
public AbstractApplicationContext(@Nullable ApplicationContext parent) {
this();
setParent(parent);
}
this()方法主要做的事情是:
1. 定义一个上下文唯一id
private String id = ObjectUtils.identityToString(this);
显示名称:
private String displayName = ObjectUtils.identityToString(this);
BeanFactoryPostProcessors在刷新时应用
private final List<BeanFactoryPostProcessor> beanFactoryPostProcessors = new ArrayList<>();
指示此上下文当前是否处于活动状态的标志
private final AtomicBoolean active = new AtomicBoolean();
指示此上下文是否已关闭的标志。
private final AtomicBoolean closed = new AtomicBoolean();
“刷新”和“销毁”的同步监视器。
private final Object startupShutdownMonitor = new Object();
//创建一个资源模式解析器(其实就是用来解析xmL配置文件)
public AbstractApplicationContext() {
this.resourcePatternResolver = getResourcePatternResolver();
}
setParent(parent)
设置此应用程序上下文的父级。
如果父环境为非null且其环境是ConfigurableEnvironment的实例,则父环境将与此(子)应用程序上下文环境合并。
public void setParent(@Nullable ApplicationContext parent) {
this.parent = parent;
if (parent != null) {
Environment parentEnvironment = parent.getEnvironment();
if (parentEnvironment instanceof ConfigurableEnvironment) {
getEnvironment().merge((ConfigurableEnvironment) parentEnvironment);
}
}
最后一个重要点:
//设置xml文件的验证标志,默认是ture
private boolean validating = true;
下一篇:spring源码-前置篇setConfigLocations(二)
这篇博客深入探讨了Spring框架中ApplicationContext的初始化过程,特别是`ClassPathXmlApplicationContext`的创建。文章详细介绍了从加载配置文件到创建bean工厂的步骤,涉及到`AbstractApplicationContext`及其子类的作用,以及在启动过程中如何处理配置、bean定义和上下文刷新。内容涵盖了类继承结构、重要方法的实现,如`refresh()`和`setParent()`,以及相关标志和属性的设置。通过对源码的分析,揭示了Spring上下文如何管理和处理bean的生命周期。
1648

被折叠的 条评论
为什么被折叠?



