Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。
Spring Bean的生命周期总体分为四个阶段:实例化=>属性注入=>初始化=>销毁
1.实例化Bean:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;
2.注入对象依赖的属性值(或对象)
3.属性注入后,进行初始化Bean的操作,初始化又涉及以下几个过程:
- 处理各种Aware接口:Spring 会检测该 Bean 是否实现了 xxxAware 接口,通过 Aware 类型的接口,可以让 Spring 框架为当前 Bean 注入相应的内容。
- 如果 Bean 实现 BeanNameAware 接口,会调用它实现的 setBeanName ( String beanId )方法,注入 Bean 的名字;
- 如果 Bean 实现 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,注入 ClassLoader 对象的实例;
- 如果 Bean 实现 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,注入的是 Spring 工厂;
- 如果 Bean 实现 ApplicationContextAware 接口,会调用 setApplicationContext ()方法,注入 Spring 上下文;
- 执行 BeanPostProcessor 前置处理:如果想对 Bean 进行一些自定义的前置处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,将会在该阶段调用 postProcessBeforeInitialization ( Object obj , String s ) 方法。
- 执行 InitializingBean 初始化方法:如果 Bean 实现了 InitializingBean 接口,执行 afeterPropertiesSet()方法。
- 执行 init-method 自定义初始化方法:如果 Bean 在Spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法。
- 执行 BeanPostProcessor 后置处理:如果这个 Bean 实现了 BeanPostProcessor 接口,将会调用 postProcessAfterInitialization ( Object obj , String s )方法,由于这个方法是在 Bean 初始化结束后调用;
以上几个步骤完成后, Bean 已经被正确创建,可以正常使用这个 Bean 。
4.当Bean不再需要时,进行销毁操作:
- 执行 DisposableBean 销毁 Bean :当 Bean 不再需要时,会经过清理阶段,如果 Bean实现了DisposableBean这个接口,会调用其实现的 destroy ()方法执行销毁;
- 执行 destroy - method 自定义销毁方法:如果这个Bean的Spring 配置中配置了 destroy - method 属性,会自动调用其配置的自定义销毁方法。