栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

spring 源码通过xml方式容器刷新前的准备

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

spring 源码通过xml方式容器刷新前的准备

简介

spring大体可以分为两个路线,一个是容器(DefaultSingletonBeanRegistry),一个是应用上下文(ApplicationContext),它们都是子BeanFactory的实现

    DefaultSingletonBeanRegistry 用于缓存bean定义信息及beanApplicationContext 上下文,用于保存spring应用过程的信息

接下来是以XML解析的方式深入探索

源码还没有构建的可以参考

ClassPathXmlApplicationContext xml解析应用上下文
public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {
	//指定父容器
	super(parent);
	//设置加载文件
	setConfigLocations(configLocations);
	if (refresh) {
		//开始刷新容器
		refresh();
	}
}
refresh() 开始刷新容器

刷新容器基本包括这些步骤

    获得容器加载Bean定义信息(创新Bean必要的信息)执行BFPP(Bean定义信息后置处理器)注册BFPP(Bean的后置处理器)Bean的实例化填充属性执行Aware接口执行BPP before方法初始化执行BPP after方法销毁bean

那么咱们先看下获得容器

prepareRefresh(); 启动容器前准备

启动前准备有这几个作用

    设置启动时间设置启动和关闭标识准备环境准备应用监听及事件
// AbstractApplicationContext.prepareRefresh
protected void prepareRefresh() {
	// Switch to active.
	this.startupDate = System.currentTimeMillis();
	this.closed.set(false);
	this.active.set(true);
	
	if (logger.isDebugEnabled()) {
		if (logger.isTraceEnabled()) {
			logger.trace("Refreshing " + this);
		}
		else {
			logger.debug("Refreshing " + getDisplayName());
		}
	}
	//供子类扩展
	initPropertySources();
	//准备环境
	getEnvironment().validateRequiredProperties();
	//准备应用监听及事件
	if (this.earlyApplicationListeners == null) {
		this.earlyApplicationListeners = new linkedHashSet<>(this.applicationListeners);
	}
	else {
		this.applicationListeners.clear();
		this.applicationListeners.addAll(this.earlyApplicationListeners);
	}
	this.earlyApplicationEvents = new linkedHashSet<>();
}
obtainFreshBeanFactory 获取容器

容器刷新主要做了这些事情

    获得一个新的容器 设置容器表示定制化工厂(属性覆盖,循环依赖)加载Bean定义信息
protected final void refreshBeanFactory() throws BeansException {
	//存在bean工厂销毁
	if (hasBeanFactory()) {
		destroyBeans();
		closeBeanFactory();
	}
	try {
		//获取新的工厂
		DefaultListableBeanFactory beanFactory = createBeanFactory();
		//设置标示
		beanFactory.setSerializationId(getId());
		//定制化工厂(是否允许属性覆盖,是否允许循环依赖)
		customizeBeanFactory(beanFactory);
		//加载bean的定义信息
		loadBeanDefinitions(beanFactory);
		this.beanFactory = beanFactory;
	}
	catch (IOException ex) {
		throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
	}
}

加载Bean定义信息是Spring中非常重要的环节,咱们下篇深入了解loadBeanDefinitions(beanFactory)方法实现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/756252.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号