理理Spring中一个bean的创建过程-------AbstractApplicationContext这个抽象类中的refresh()方法

在这里插入图片描述

IOC流程:
1)准备工作,设置启动时间,设置closed为false,设置active为true,初始化一些资源,创建一些set
2.1)创建工厂,创建出来的工厂名字叫做DefaultListableBeanFactory

2.2)设置工厂的一些属性值
2.3)读取配置文件信息,将beanNanme和beanClass设置到Definitions中
            //2.1
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			//2.2
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			//2.3
			loadBeanDefinitions(beanFactory);
			this.beanFactory = beanFactory;
3)初始化beanFactory的属性
		prepareBeanFactory(beanFactory);
4)执行一些扩展方法,没有默认实现,需要的时候再进行实现
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
	}
5)实例化并调用所有已注册的BeanFactoryPostProcessor Bean
invokeBeanFactoryPostProcessors(beanFactory);
6)将实例化好的BeanFactoryPostProcessor注册进去
registerBeanPostProcessors(beanFactory);
7)做一些国际化处理,可以不理它
initMessageSource();
8)初始化多播器,和监听器,方便后面进行事件的监听和广播
initApplicationEventMulticaster();
registerListeners();
public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");

			// Prepare this context for refreshing.
			//(1)准备容器环境
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			//(2)获取新鲜的工厂,创建出来的工厂名字叫做DefaultListableBeanFactory
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			(3)
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				4)
				postProcessBeanFactory(beanFactory);

				StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
				// Invoke factory processors registered as beans in the context.
				(5)
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				(6)
				registerBeanPostProcessors(beanFactory);
				beanPostProcess.end();

				// Initialize message source for this context.
				initMessageSource();

				// Initialize event multicaster for this context.
				(7)
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				onRefresh();

				// Check for listener beans and register them.
				(8)
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				(9)
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				finishRefresh();
			}

以上是在对做一些工厂的准备工作,对应我们图上的左边部分,到了第九步,就要开始实例化bean了

	// Instantiate all remaining (non-lazy-init) singletons.
				finishBeanFactoryInitialization(beanFactory);		
(1)先遍历List,取出所有的BeanDefinition,对里面的bean进行实例化

(1.1)先从单例池中拿,拿不到再开始进行实例化
	// Eagerly check singleton cache for manually registered singletons.
		Object sharedInstance = getSingleton(beanName);
(1.2)获取构造方法,利用反射进行bean的创建
	Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
	return instantiateBean(beanName, mbd);	
	return ctor.newInstance(argsWithDefaultValues);	
(2)实例化bean后,就开始填充属性
populateBean(beanName, mbd, instanceWrapper);
(3)填充完属性就开始调用aware方法,以及调用BeanPostProcessor:before,执行init,初始化bean,以及调用BeanPostProcessor:after方法
exposedObject = initializeBean(beanName, exposedObject, mbd);
点进去:
invokeAwareMethods(beanName, bean);
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

以上是一个bean被创建的完整过程的主要脉络,至于AOP,循环依赖等,都是在这个脉络中的分支,只要理清了AbstractApplicationContext这个抽象类中的refresh()方法,那看源码时就不会晕了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值