Spring 容器中 Bean的生命周期

        Spring Bean的生命周期区别于普通的 Java 对象需要通过 new 创建对象,Spring 的 Bean 由 IoC 容器进行实例化、组装以及管理的。也就是说 Bean 的生命周期完全由 IoC 容器控制。Spring Bean的生命周期是从 Bean 实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对 象,最终存 储到单例池中,这个过程被称为Spring Bean的生命周期。

Spring Bean的生命周期大体上分为三个阶段:

1:Bean的实例化阶段:

        Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是 singleton的, 是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的 Bean通过反射进行实例化;

2:Bean的初始化阶段:

        Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执 :行一些Aware 接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等。该阶段是Spring最具技术含量和复杂度的阶段

3:Bean的完成阶段:

经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池 singletonObjects中。

实例化:

通过 AbstractBeanFactory getBean 方法获取单例模式的 bean

初始化:

初始化就是 AbstractAutowireCapableBeanFactory 抽象类的 initializeBean 方法,里面包含几个步骤:

1:Bean实例的属性填充

注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没

有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;

2:Aware接口属性注入,若接口实现 xxxAware 接口,调用对应的实现 setBeanName,setBeanClassLoader,setBeanFactory 方法

BeanNameAware 接口:

接口中只有一个方法 void setBeanName(String name) 用于获取当前 Bean 的名称。

BeanFactoryAware 接口:

接口中只有一个方法 void setBeanFactory(BeanFactory beanFactory) 用于获取当前的 BeanFactory。

ApplicationContextAware 接口:

接口中只有一个方法 void setApplicationContext(ApplicationContext applicationContext) 用于获取当前的 ApplicationContext。

例如:

实现了实现了BeanNameAware,BeanFactoryAware,ApplicationContextAware接口

在实体类中重写接口的方法打印一下

3:BeanPostProcessor的before()方法回调

4:InitializingBean接口的初始化方法回调

实现接口后,重写接口的初始化方法

5:自定义初始化方法init回调 

也可以在类中自己定义一个方法,通过xml文件中的init-method的属性,选择自己定义的方法名实现属性初始化。

6:BeanPostProcessor的after()方法回调

当初始化阶段走完,会将实例化好并初始化好的Bean存储到单例池singletonObjects中。

代码实现:

实体类:

后处理器:

XML文件:

生命周期的顺序:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值