Spring Bean生命周期

1.Bean加载过程

Step 1:尝试从缓存中获取Bean实例(从singletonFactory获取,即singletonFactory.getObject()方法)

singletonObjects:BeanName和bean实例之间的关系

singletonFacories:BeanName和bean工厂之间的关系

earlySingletonObjects:创建过程中的Bean,即创建过程BeanName和bean实例之间的关系

Step 2:若Step 1获取成功,则检测用户想返回的Bean实例是否是工厂Bean,若是直接返回,否则,需要从工厂Bean中获取Bean实例(调用factory.getObject();方法返回Bean实例,调用完成后调用postProcessAfterInitialization方法)

Step 3:若Step 1获取失败,则新建Bean创建过程见下

Step 4:检测新建的Bean实例是否是工厂Bean,若是直接返回,否则,需要从工厂Bean中获取Bean实例(调用factory.getObject();方法返回Bean实例,调用完成后调用postProcessAfterInitialization方法)

Step 5:加载完成

2.Bean创建过程

Step 1:验证及准备覆盖的方法

覆盖方法从AbstractBeanDefinition类中的属性获取,即在解析spring配置文件时,把lookup-method和replace-method放到该类的属性中

private MethodOverrides methodOverrides = new MethodOverrides();

Step 2:实例化的前置处理。即调用实现了BeanPostProcessor接口的类中的postProcessBeforeInstantiation方法,若返回的Bean已经初始化,则调用实现了BeanPostProcessor接口的类中的postProcessAfterInstantiation方法,创建Bean结束,否则进入Step 3.

Step 3:若工厂方法不为空则使用工厂方法初始化(即Bean标签中的factory-method属性),否则解析构造函数并进行构造函数的实例化。

实例化结合了反射(没有使用replace和lookup方法)和代理(使用了replace和lookup方法)方式对Bean进行实例化

Step 4:若单例Bean且在创建中,需要把该单例工厂暴露出来(解决单例的循环依赖)

Step 5:属性填充

Step 6:初始化Bean

  1. 对特殊Bean的处理,如BeanFactoryAware、BeanNameAware、ApplicationContextAware

    等等

  2. 实现BeanPostProcessor接口调用postProcessBeforeInstantiation方法

  3. 如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet方法,作用与在配置文件中对Bean使用init-method声明初始化的作用一样,都是在Bean的全部属性设置成功后执行的初始化方法。

  4. 实现BeanPostProcessor接口调用postProcessAfterInstantiation方法

  5. 注册销毁方法,如destroy-method方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bboyzqh

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值