Spring的生命周期
在spring学习笔记中有生命周期,这里单独拿出来详细讲一讲
1 笔记中的内容
根据上图,Bean的生命周期执行过程如下:
- 根据配置情况调用Bean的构造方法或工厂方法实例化Bean
- 利用依赖注入完成Bean中所有属性值的配置注入
- 如果Bean实现了BeanNameAware接口,则Spring调用setBeanName()方法传入当前Bean的id值
- 如果Bean实现了BeanFactoryAware接口,则Spring调用setBeanFactory()方法传入当前工厂实例的引用
- 如果Bean实现了ApplicationContextAware接口,则Spring调用setApplicationContext()方法传入当前ApplicationContext实例的引用。
- 如果BeanPostProcessor和Bean关联,则Spring将调用该接口的与初始化方法postProcessBeforelnitialzation()对Bean进行加工操作,这个非常重要,Spring的AOP就是用它实现的
- 如果Bean实现了InitializingBean接口,则Spring将调用afterPropertiesSet()方法
- 如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。
- 如果有 BeanPostProcessor 和 Bean 关联,则Spring将调用该接口的初始化方法postProcessAfterlnitialization()。此时,Bean已经可以被应用系统使用了。
- 如果在中指定了该Bean的作用范围为scope=“singleton”,则将该Bean放入Spring IoC的缓存池中,将触发Spring对该Bean的生命周期管理;如果在中指定了该Bean的作用范围为scope=“prototype”,则将该Bean交给调用者,调用者管理该Bean的生命周期,Spring不在管理该Bean。
- 如果Bean实现了DisposableBean接口,则Spring会调用destory()方法将Spring中的Bean销毁;如果在配置文件中通过destory-method属性制定了Bean的销毁方法,则Spring将调用该方法进行销毁。
2 概述
上面的步骤谁记得住?疯了,首先我们将bean的生命周期分成:
- Bean创建
- Bean销毁
两个,这样没有问题吧,然后再看创建都干了啥?
2.1 Bean创建
之前的beandefinition和BeanFactorypostprocessor略过不讲,实例化之前已经将配置文件中的bean放到BeanFactory容器当中了,创建分为如下步骤:
- Bean实例化:创建一个Bean对象,创建完后属性值是空的,需要初始化
- Bean初始化:进行一系列填充和之后的处理
Bean的初始化可以分为:
- 填充属性
- 执行一系列Aware接口方法
- BeanPostProcessor(后置处理器)
- before:返回bean实例可能是原始包装器,如applicationContext
- init-method:执行初始化方法
- after:再执行after返回
至此Bean对象就是一个完整的对象了,可以直接拿过来使用。
2.2 Bean销毁
- 调用DisposableBean的destroy方法
- 调用自定义的销毁方法
3 参考博客
-
从xml或注解配置中读取bean定义,进行实例化
-
首先设置自定义bean的属性
-
如果bean实体类中实现了一系列Aware接口,则设置这些的属性
注:假设有如下User实体类
private Integer id; private String name; private BeanFactoryAware beanFactoryAware; private BeanApplicationContextAware beanApplicationContextAware;
Aware接口:Spring提供了广泛的Aware回调接口,让bean向容器表明它们需要某种基础设施依赖
-
执行通用的方法前置处理:BeanPostProcessor.postProcessorBeforeInitialization();对Bean进行加工处理
-
执行 InitalizingBean.afterPropertiesSet() 方法
-
执行Bean自定义的初始化方法init,或者 @PostConstruct 标注的方法;
-
执行方法BeanPostProcessor.postProcessorAfterInitialization(),创建对象完毕
-
执行 DisposableBean.destory() 方法;
-
执行自定义的destory方法或者 @PreDestory 标注的方法;
-
销毁对象完毕