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

博客介绍了工厂准备工作后,第九步开始实例化bean,阐述了bean创建完整过程的主要脉络。指出AOP、循环依赖等是此脉络分支,理清AbstractApplicationContext抽象类中refresh()方法,看源码就不会晕。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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()方法,那看源码时就不会晕了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值