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文件:
生命周期的顺序: