spring容器的启动过程

1.初始化bean容器工厂DefaultListableBeanFactory

2.从xml,注解等收集bean的定义信息,缓存在BeanDefinition中,包含了spring中所有的元数据

3.BeanFactoryPostProcess扩展(此处进行bean定义信息扩展,占位符替换。属性值修改等等一列初始化bean之前的扩展操作)(所有实现了BeanFactoryPostProcess接口的类全部在此实例化)

4.BeanPostProcesvs扩展,所有实现了BeanFactoryPostProcess接口的类全部再次实例化。并放入BeanPostProcess容器

5.初始化事件发布者,所有实现了ApplicationListener的接口全部再次实例化,并放入ApplicationListener容器,等待执行事件。

6.剩余所有未实例化的bean全部在此实例化。

6.1 获取beanDefinition信息准备进行实例化操作

6.2 cglib实例化对象

6.3 将实例化后的半成品对象提前放入3级缓存中,用来解决可能出现的循环依赖问题

6.5Bean属性的填充

6.5.1循环处理所有的BeanFactory.postProcessProPertyValues(),包括@Autowire注解注入,主要处理注解注入(会有循环依赖)

6.5.2 xml中bean的value信息开始进行赋值(主要处理xml配置)(会有循环依赖)

6.6开始执行init方法。

6.6.1 调用Aware方法,包括BeanNameAware,BeanFactoryAware等等

6.6.2 调用ApplicationContecntAware方法,将上下文设置到Bean中。

6.6.3 调用BeanPostProcess.before()(循环调用)

6.6.4调用InitializingBean的afterPropertiesSet()方法,做一些初始化操作

6.6.5调用BeanPostProcess.after()方法(循环调用)

6.7注册DisPosableBean注销方法,待容器销毁时执行

6.8将成品bean放入1级缓存,如果不存在循环依赖,那么此时的bean在3级缓存中,通过ObjectFactory.getObject()获取出普通bean,然后放入1级缓存,如果存在循环依赖,此时的bean已经被注入对象提前执行了ObjectFactory.getObject(),并放入了2级缓存。目标bean只需要从2,3级缓存中获取出来然后放入1级缓存。

说明:ObjectFactory.getObject()如果是普通bean,那么getObject返回的就是当前Bean对象,如果是Aop代理,那么getObject获取到的是一个Aop代理对象,例如@Transactional,@Aspect有关的注解

6.8最后开始处理FactoryBean对象,getObjectForBeanInstance方法中处理FactoryBean.getObject()获取然后注入到factoryBeanObjectCache缓存中,然后返回getObject()对象。

说明:(此时容器中有2个对象,一个是实现FactoryBean本身的bean在spring1级缓存中国,另一个是getObject返回的对象。在factoryBeanObjectCache缓存中,当执行getBean("name")的时候返回的是factoryBeanObjectCache缓存中的值。如果想返回本身,可以通过getBean("&name")返回)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值