spring程序员前置知识-ApplicationContext执行过程分析-其二

在上一篇文章中已经分析了之前的过程,这篇文章将分析后面三个主要阶段,至此,spring整个执行过程的主要阶段就分析完成。

调用finishBeanFactoryInitialization(beanFactory);这方法里面首先实例化bean,然后执行依赖注入,最后执行初始化方法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.bean实例化

执行createBeanInstance(beanName, mbd, args);这方法来创建对象。这里面如果有基于构造方法注入otherbean,如果otherbean不能存在,则先创建otherbean的对象,并且这个otherbean会执行声明周期形成一个完整的单例bean放入到单例池中,如果otherbean构造方法又依赖另一个thirdbean,这则又要先创建thirdbean,并且执行完整个生命周期方法,形成一个完整的bean的放入单例池,然后继续otherbean,最后返回到当前bean的构造方法,以此类推。然后当前这个bean就实例化完成了,注意当前这个bean还没有执行依赖注入和初始化都没有执行,他依赖的otherbean是执行完整个生命周期方法形成完整bean了。

注:这里面就涉及到所谓的spring三级缓存来解决循环依赖,但是如果两个bean都是基于构造方法循环依赖对方的话,spring三级缓存是没办法解决的,当然程序会直接报错。这里只能解决属性注入的循环依赖,也就是通过 @Autowired或者@Resource注入产生的循环依赖。

2.bean依赖注入

执行populateBean(beanName, mbd, instanceWrapper);这个方法执行依赖注入,方法内部主要就是通过反射执行属性的set或者方法的invoke(当然不是直接用java原生的反射api,spring自己内部封装了一套反射的工具),即标注@Autowired或者@Resource标注的属性或者方法,这里如果要注入属性在spring容器找不到,又会先创建依赖的bean,这就又回到了第一步bean的实例化。这个阶段完成以后所有bean的依赖注入就完成了。

3.bean初始化

执行exposedObject = initializeBean(beanName, exposedObject, mbd);这个方法有四个步骤:
1.执行Aware接口的回调(如果实现了相关Aware接口)
2.执行BeanPostProcessor的postProcessBeforeInitialization回调
3.执行初始化,即@PostConstructor标注的方法、实现了InitializingBean的afterPropertiesSet方法
4.执行BeanPostProcessor的postProcessAfterInitialization回调
在这里插入图片描述

4.总结

这就是spring执行的整个过程,当然只分析主要的过程。总的来说,程序员能够介入的spring的过程,spring已经给我们留好了扩展方式,主要就是两种方式:

BeanFactoryPostProcessor和BeanPostProcessor
》》》》》》
其中BeanFactoryPostProcessor可以向spring容器中添加一些bean定义信息。经常会说springboot自动配置,如何能做到自动配置,就是通过BeanFactoryPostProcessor的功能实现的。
》》》》》》
其中BeanPostProcessor可以在bean放入到单例池之前做一些事情,比如可以生成代理对象。spring的事务控制,就是在BeanPostProcessor的postProcessAfterInitialization回调的时候,生成当前bean的代理对象,然后把代理对象存入到单例池中,如果bean实现接口的话,直接用jdk的动态代理,如果就是一个类,则使用cglib生成代理对象。

大道不孤,众行致远。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值