Ioc容器refresh总结(5)--- Spring源码从入门到精通(三十五 )

上篇文章主要介绍:

先创建applicationEventMulticaster多播(派发)器,再注册registerListener添加到派发器中,之后下篇文章将介绍如何调用spring监听,这篇文章先介绍bean创建,因为监听在bean创建完成之后调用。

Ioc容器refresh总结(4)--- Spring源码从入门到精通(三十四 )

十一、finishBeanFactoryInitialization

  1. preInstantiateSingletons;初始化剩下的单实例bean。
  1. 获取容器中的所有bean,依次进行初始化和创建对象。
  2. 获取bean的定义信息:RootBeanDefination
  3. Bean不是抽象,是单实例,不是懒加载,则true;

a.判断是否是factoryBean,是否是实现factoryBean接口的;不是工厂bean,则用getBean创建对象(ioc容器的getBean方法)。

b.先从缓存中获取保存了单实例的bean,如果能获取到,说明之前被创建过(所有创建过得单实例bean都会被缓存起来Map<String,Object> singleObjects,这里也就是一级缓存)。

c.缓存中没有的话,开始创建对象流程。

d.markBeanAsCreate()标记当前bean已被创建。(防止多线程的时候创建多个对象导致不是单实例)。

e.获取bean的定义信息。

f.获取当前bean依赖的其他bean。如果存在依赖的bean,通过getBean先创建出来。

g.启动创建单实例流程;

1).创建createBean;

2).resolveBeforeInstantiation。先获取bean,通过提前执行,先执行beanPostProcessorBeforeInstantiation,如果有返回在执行beanPostProcessorAfterInitialization。

3)如果beanPostProcessorBeforeInstantiation没有返回代理对象,则开始下面的创建bean。

前面都是预处理,下面开始正式创建bean

4)doCreateBean()方法内需要做的如下:

a、创建bean实例,createBeanInstance利用工厂方法或者对象构造器创建bean实例,里面会determineCandidateConstruct推断使用啥构造器之前。

b、调用postProcessMergedBeanDefination预处理@Autowired@Value

c、先调用getEarlyBeanReference提早获取bean,防止循环依赖。populate给bean赋值,调用postProcessPropertyValue给bean属性赋值。

接下来开始bean的初始化

d、initializeBean初始化bean,先执行invokeAwareMethods,执行aware接口的方法。如果组件实现了这些接口beanNameAware,beanClassLoaderAware,beanFactoryAware,则会回调。

e、调用后置处理器beanPostProcessBeforeInitialization调用bean初始化之前的方法。(此处可以实现initializaingBean接口,可以注解@PostConsrtuct,或者和@bean一起用init-method)

f、invokeInitMethods,

1)、判断是否是实现initializaingBean接口初始化。

2)、是否自定义初始化。

g、调用后置处理器beanPostProcessAfterInitizlization调用bean初始化之后的方法。(bean初始化就完成了)

bean初始化完成后注册bean的销毁方法

h、注册bean的销毁方法(只是注册,调用的时候是容器销毁时候才调用)

beanPostProcessDestruction,@PreDestory,DisposableBean,destory-method调用。

Bean对象创建出来之后调用addSingleton()方法,将创建的bean添加到一级缓存中。

1、先在初始化对象之前(填充populate对象之前)addSingletonFactory放在三级缓存,并清空二级缓存earlySingleton。在后面getSingleton方法里会清空三级缓存,放入二级缓存earlySingleton。最后bean创建成功会放入一级缓存中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值