Spring源码(三)— 创建BeanFactory

上一篇中,已经创建环境对象(StandardEnvironment)并解析了给定的xml文件路径,在prepareRefresh方法中也将容器的标志位进行了设置。本篇会着重讲解BeanFactory的创建,以及在BeanFactory创建时的初始化动作。

	public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {
		// 调用父类构造方法,进行相关的对象创建等操作,包含属性的赋值操作
		super(parent);
		setConfigLocations(configLocations);
		if (refresh) {
			refresh();
		}
	}

refresh

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			/**
				1. 设置容器开始时间
				2. 设置激活标志位
				3. 设置关闭标志位
				4. 获取Environment对象,将当前系统属性对象放到Environment中
				5. 准备监听集合对象,默认为null。
			*/
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			//创建容器对象DefaultListableBeanFactory
			//完成BeanDefinition的初始化。
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
			//省略部分代码
		}
	}

obtainFreshBeanFactory()

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		// 刷新beanFactory
		refreshBeanFactory();
		// 获取beanFactory对象
		return getBeanFactory();
	}

refreshBeanFactory

如果存在beanFactory就销毁,并获取新的DefaultListableBeanFactory

protected final void refreshBeanFactory() throws BeansException {
		// 如果存在beanFactory,则销毁关闭beanFactory
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			//创建DefaultListableBeanFactory,会在父类AbstractAutowireCapableBeanFactory构造方法中,忽略Aware接口
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			// 为了序列化指定id,可以从id反序列化到beanFactory对象
			beanFactory.setSerializationId(getId());
			//定制beanFactory,设置相关属性,包括是否允许覆盖同名称的不同定义的对象以及循环依赖
			customizeBeanFactory(beanFactory);
			//加载xml文件
			loadBeanDefinitions(beanFactory);
			this.beanFactory = beanFactory;
		}
		catch (IOException ex) {
		}
	}

createBeanFactory()
创建一个DefaultListableBeanFactory,并在父类 构造器中进行要依赖接口的忽略。

//DefaultListableBeanFactory的父类
public AbstractAutowireCapableBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		this();
		//设置父类工厂
		setParentBeanFactory(parentBeanFactory);
	}
public AbstractAutowireCapableBeanFactory() {
		super();
		// 忽略要依赖的接口
		ignoreDependencyInterface(BeanNameAware.class);
		ignoreDependencyInterface(BeanFactoryAware.class);
		ignoreDependencyInterface(BeanClassLoaderAware.class);
	}
public void setParentBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		// 如果当前已经有一个父级bean工厂,且传进来的父级bean工厂与当前父级bean工厂不是同一个
		if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
			// 抛出异常
		}
		if (this == parentBeanFactory) {
			throw new IllegalStateException("Cannot set parent bean factory to self");
		}
		this.parentBeanFactory = parentBeanFactory;
	}

customizeBeanFactory
可重写customizeBeanFactory方法来改写allowBeanDefinitionOverriding和allowCircularReferences的值

protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
		// 如果属性allowBeanDefinitionOverriding不为空,设置给beanFactory对象相应属性,是否允许覆盖同名称的不同定义的对象
		if (this.allowBeanDefinitionOverriding != null) {
			beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
		}
		// 如果属性allowCircularReferences不为空,设置给beanFactory对象相应属性,是否允许bean之间存在循环依赖
		if (this.allowCircularReferences != null) {
			beanFactory.setAllowCircularReferences(this.allowCircularReferences);
		}
	}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值