一起学SF框架系列4.5-spring-context-AbstractRefreshableApplicationContext

AbstractRefreshableApplicationContext继承于AbstractApplicationContext,主要实现BeanFactory刷新(含初始化)。

类作用

1、在基类AbstractApplicationContext多次调用refresh()时,本类负责每次都创建一个新的内部 bean 工厂实例,并加载 bean 定义。
2、注意在web环境下,同ApplicationContext相似的基类是WebApplicationContexts,也有一个同样的子类AbstractRefreshableWebApplicationContext实现同样的功能。

关键类方法

setAllowBeanDefinitionOverriding

设置是否应允许通过注册具有相同名称的bean定义来覆盖原来bean定义。默认为true

setAllowCircularReferences

设置是否允许bean之间可以循环引用,并试着自动解决它们。默认为true。如果设置为false,碰到循环引用就抛出异常。

refreshBeanFactory

该类的关键方法。
作用:关闭之前的 bean 工厂(如果有的话),并为容器生命周期的下一阶段初始化一个新的 bean 工厂

	protected final void refreshBeanFactory() throws BeansException {
	    #关闭之前beanFactory
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
		    #创建新的BeanFactoryDefaultListableBeanFactory类是框架中spring-Bean模块核心类
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			#设置BeanFactory序列化器用到id为所属容器id
			beanFactory.setSerializationId(getId());
			#设置beanFactory是否支持Bean可覆盖及可循环引用
			customizeBeanFactory(beanFactory);
			#将 bean 定义加载到给定的 bean 工厂中,方法由子类实现。
			loadBeanDefinitions(beanFactory);
			this.beanFactory = beanFactory;
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}

代码中关键方法:
createBeanFactory():创建BeanFactory,核心在Bean模块的DefaultListableBeanFactory类。
loadBeanDefinitions():加载Bean定义,为抽象方法,在子类中实现。通常ApplicationContext是基于何种方式来创建,就在对应的类或基类中实现。如应用容器是ClassPathXmlApplicationContext创建,其实现是在本类子孙类AbstractXmlApplicationContext中实现,详见https://blog.csdn.net/davidwkx/article/details/130702324

方法执行序列图

为了有助于理解方法全貌,参考如下方法序列图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐享技术

每一个打赏,都是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值