spring源码解析- 前置篇 super方法

这篇博客深入探讨了Spring框架中ApplicationContext的初始化过程,特别是`ClassPathXmlApplicationContext`的创建。文章详细介绍了从加载配置文件到创建bean工厂的步骤,涉及到`AbstractApplicationContext`及其子类的作用,以及在启动过程中如何处理配置、bean定义和上下文刷新。内容涵盖了类继承结构、重要方法的实现,如`refresh()`和`setParent()`,以及相关标志和属性的设置。通过对源码的分析,揭示了Spring上下文如何管理和处理bean的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(二)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值