Spring Bean的生命周期只有四个阶段:
- 实例化 Instantiation===》属性赋值 ======》Populate======》初始化 Initialization =======》销毁 Destruction
-
实例化 Bean:
程序启动后,Spring把注解或者配置文件定义好的Bean对象转换成一个BeanDefination对象,然后完成整个BeanDefination的解析和加载的过程。Spring获取到这些完整的对象之后,会对整个BeanDefination进行实例化操作,实例化是通过反射的方式创建对象。 -
设置对象属性(依赖注入):
实例化后的对象被封装在BeanWrapper对象中,并且此时对象仍然是一个原生的状态,并没有进行依赖注入。Spring根据BeanDefinition中的信息进行依赖注入, populateBean方法来完成属性的注入。 -
Aware 接口:
- 如果Bean 实现了BeanNameAware 接口,则Spring 调用Bean 的setBeanName() 方法传入当前Bean 的id 值。
- 如果Bean 实现了BeanFactoryAware接口,则Spring 调用setBeanFactory() 方法传入当前工厂实例的引用
- 如果Bean 实现了ApplicationContextAware 接口,则Spring 调用setApplicationContext() 方法传入当前ApplicationContext实例的引用(ApplicationContext,有多种称呼,比如“应用容器”、“环境”、“上线文”...)
- 这几个接口的执行顺序分别是BeanNameAware--------->BeanFactoryAware------------------------------->ApplicationContextAware;
-
BeanPostProcessor前置处理:
- 如果BeanPostProcessor 和Bean 关联,则Spring 将调用该接口的预初始化方法postProcessBeforeInitalzation()对Bean 进行加工操作,Spring 的AOP 就是利用这个实现
-
@Slf4j public class MyBeanPostProcessor implements BeanPostProcessor { /** * 实现了BeanPostProcessor接口后,重写postProcessBeforeInitialization,在各种Aware接口执行完毕后执行该方法 * * @param bean 本次处理的bean * @param beanName 本次处理的beanName(bean id) * @return 返回的是在本方法中处理后的bean */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { log.info("MyBeanPostProcessor.postProcessBeforeInitialization, beanName:{}, bean:{}", beanName, bean); return bean; } /** * 实现了BeanPostProcessor接口后,重写postProcessBeforeInitialization,在initMethod方法执行完毕后执行该方法 * * @param bean 本次处理的bean * @param beanName 本次处理的beanName(bean id) * @return 返回的是在本方法中处理后的bean */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { log.info("MyBeanPostProcessor.postProcessAfterInitialization, beanName:{}, bean:{}", beanName, bean); return bean; } }
-
InitalizingBean 接口:
- 如果Bean 实现了InitalizingBean 接口,则Spring 将调用afterPropertiesSet()方法。
-
@Data @Slf4j public class Student implements InitializingBean { private Integer id; private String name; @Override public void afterPropertiesSet() throws Exception { // 同样可以在这里修改bean的属性值 log.info("InitialingBean.afterPropertiesSet, this:{}", this); } }
-
init-method (容器缓存阶段):
- 如果在配置文件中通过init-method 属性指定了初始化方法,则调用该初始化方法。
-
BeanPostProcessor(后置处理器):
- 如果BeanPostProcessor 和Bean 关联,则Spring 将调用该接口的初始化方法postProcessAfterInitialization。此时Bean 就可以被应用系统使用了。
-
DisposableBean(销毁实例阶段):
- 如果实现了DisposableBean 接口,则Spring 会调用destory() 方法将Spring 中的Bean 销毁;
-
destroy-method:
- 如果再配置文件中通过destory-method 属性指定了Bean 的销毁方法,则Spring 将调用该方法对Bean 进行销毁。