SpringIOC源码解析二

obtainFreshBeanFactory()

进入方法

	protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		//初始化bean工厂并赋值给AbstractRefreshableApplicationContext
		refreshBeanFactory();
		//调用AbstractRefreshableApplicationContext的getBeanFactory方法返回DefaultListableBeanFactory
		//DefaultListableBeanFactory实现了ConfigurableListableBeanFactory接口
		return getBeanFactory();
	}

在进入refreshBeanFactory方法

	@Override
		protected final void refreshBeanFactory() throws BeansException {
			//判断beanFactory是否为空,如果存在则先销毁、关闭该 BeanFactory
			if (hasBeanFactory()) {
				destroyBeans();
				closeBeanFactory();
			}
			try {
				//初始化一个DefaultListableBeanFactory
				DefaultListableBeanFactory beanFactory = createBeanFactory();
				//给beanfactroy设置SerializationId为下面那样
				// 如org.springframework.context.support.ClassPathXmlApplicationContext@17f6480
				beanFactory.setSerializationId(getId());
				//因为这个类里面的属性都为空实际上没做什么
				customizeBeanFactory(beanFactory);
				//加载BeanDefinition到beanfactroy
				loadBeanDefinitions(beanFactory);
				synchronized (this.beanFactoryMonitor) {
					//设置beanfactroy
					this.beanFactory = beanFactory;
				}
			}
			catch (IOException ex) {
				throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
			}
	}

进入createBeanFactory

	protected DefaultListableBeanFactory createBeanFactory() {
		//getInternalParentBeanFactory返回一个null的beanfactroy
		//new一个DefaultListableBeanFactory把beanfactroy设置给他的父类AbstractBeanFactory
		return new DefaultListableBeanFactory(getInternalParentBeanFactory());
	}

new DefaultListableBeanFactory(getInternalParentBeanFactory());最后会把beanfactory注入到AbstractBeanFactory在代码如下

	@Override
	public void setParentBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
			throw new IllegalStateException("Already associated with parent BeanFactory: " + this.parentBeanFactory);
		}
		this.parentBeanFactory = parentBeanFactory;
	}

创建好后设置到AbstractRefreshableApplicationContext的成员属性beanFactory中
下一篇解析loadBeanDefinitions(beanFactory);这个方法主要是解析xml并把bean封装成BeanDefinition注入到beanfactory中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值