Spring 容器加载流程

个人学习笔记

7、finishBeanFactoryInitialization(beanFactory);初始化完成剩下的所有单实例bean
	1、获取到所有的bean实例RootBeanDefinition
	2、判断if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) 
		1、如果通过判断是否为FactoryBean
		2、不是工厂bean,利用getBean(beanName);创建对象
			1、doGetBean(name, null, null, false);
			2、先通过getSingleton(beanName);获取已经缓存的单实例bean
				所有创建的bean都缓存到Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
			3、缓存中获取不到,开始bean的创建对象流程
			4、markBeanAsCreated(beanName);标记bean已经被创建
			5、获取bean的定义信息
			6、String[] dependsOn = mbd.getDependsOn();获取bean的其他依赖bean
			,如果有,则先创建依赖bean
			7、启动单实例bean的创建流程:
				1、createBean(beanName, mbd, args);
				2、resolveBeforeInstantiation(beanName, mbdToUse);在创建bean之前,希望返回一个代理bean
					【InstantiationAwareBeanPostProcessors】
					先触发applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
					如果有返回值则触发applyBeanPostProcessorsAfterInitialization(bean, beanName);
				3、如果没有返回代理bean,则调用doCreateBean(beanName, mbdToUse, args);创建bean 实例
				4、bean属性赋值:populateBean(beanName, mbd, instanceWrapper);
					赋值之前:
					1、拿到InstantiationAwareBeanPostProcessor后置处理器
						执行postProcessAfterInstantiation()
					2、InstantiationAwareBeanPostProcessor后置处理器
						执行postProcessPropertyValues()
					3、利用反射,用setting 给属性赋值
						applyPropertyValues(beanName, mbd, bw, pvs);
				5、bean的初始化initializeBean();
					1、执行aware接口方法invokeAwareMethods(beanName, bean);
						1、如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。
						2、如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
						3、如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。
					2、执行后置处理器初始化之前applyBeanPostProcessorsBeforeInitialization	
					BeanPostProcessor.postProcessBeforeInitialization(result, beanName);
					3、执行初始化方法invokeInitMethods(beanName, wrappedBean, mbd);
						1、是否是InitializingBean接口的实现,执行接口规定的初始化
						2、是否自定义初始化
					4、执行后置处理器初始化之后applyBeanPostProcessorsAfterInitialization()
					BeanPostProcessor.postProcessAfterInitialization(result, beanName);
				6、执行bean的销魂方法
			8、将创建好的bean放到缓存中addSingleton(beanName, singletonObject);
8、finishRefresh(); 完成BeanFactory的初始化创建工作
	1、initLifecycleProcessor();初始化和生命周期有关的处理器LifecycleProcessor
		写一个LifecycleProcessor的实现类,重写
		onRefresh();
	    onClose();
	2、getLifecycleProcessor().onRefresh();
		拿到前面定义的生命周期处理器,回调onRefresh()
	3、publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件
	4、LiveBeansView.registerApplicationContext(this);
Spring Bean 的生命周期
  1. Bean容器找到配置文件中Spring Bean的定义

  2. Bean容器利用反射创建一个Bean的实例

  3. 如果涉及到一些属性值,利用set()方法设置一些属性值

  4. 如果Bean实现了BeanNameAware接口,调用setBeanName方法,传入Bean的名字

  5. 如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader,传入ClassLoader对象的实例

  6. 如果Bean实现了BeanFactoryAware接口,调用setBeanFactory,传入AbstractAutowireCapableBeanFactory

  7. 调用BeanPostProcessor对象,执行postProcessBeforeInitialization

  8. 如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。

  9. 如果Bean在配置文件中的定义包含init-method属性,执行指定的方法。

  10. 如果有和加载这个Bean的Spring容器相关的BeanPostProcess对象,执行postProcessAfterInitialization()方法。

  11. 当要销毁Bean的时候,如果Bean实现了DisposableBean接口,执行destroy()方法。

  12. 当要销毁Bean的时候,如果Bean在配置文件中的定义包含destroy-method属性,执行指定的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值