Spring作为当前Java最流行、最强大的轻量级框架,受到了程序员的热烈欢迎。因此在面试中也常常问及该框架的相关问题。本文将讲解常见面试题【Spring Bean的生命周期】。我们通常使用ApplicationContext作为Spring容器。这里,我们讲的也是 ApplicationContext中Bean的生命周期。而实际上BeanFactory也是差不多的,只不过处理器需要手动注册。
Spring Bean的生命周期
- Bean 容器找到配置⽂件中 Spring Bean 的定义。
- Bean 容器利⽤ Java Reflection API 创建⼀个Bean的实例。
- 如果涉及到⼀些属性值 利⽤ set() ⽅法设置⼀些属性值。
- 如果 Bean 实现了 BeanNameAware 接⼝,调⽤setBeanName() ⽅法,传⼊Bean的名字。
- 如果 Bean 实现了 BeanClassLoaderAware 接⼝,调⽤ setBeanClassLoader() ⽅法,传⼊ClassLoader 对象的实例。
- 与上⾯的类似,如果实现了其他 *.Aware 接⼝,就调⽤相应的⽅法。
- 如果有和加载这个 Bean 的 Spring 容器相关的 BeanPostProcessor 对象,执⾏ postProcessBeforeInitialization() ⽅法
- 如果Bean实现了 InitializingBean 接口,执行 afterPropertiesSet() ⽅法。
- 如果 Bean 在配置⽂件中的定义包含 init-method 属性,执⾏指定的⽅法。
- 如果有和加载这个 Bean的 Spring 容器相关的 BeanPostProcessor 对象,执⾏ postProcessAfterInitialization() ⽅法
- 当要销毁 Bean 的时候,如果 Bean 实现了 DisposableBean 接⼝,执⾏ destroy() ⽅法。
- 当要销毁 Bean 的时候,如果 Bean 在配置⽂件中的定义包含 destroy-method 属性,执⾏指定的⽅法。
简单概括:
- 实例化:配置⽂件找定义,利用反射建实例。
- 属性赋值:有值则用set()设置,再看有无Awar,如有则调相关set()。
-
初始化:
如果有以下配置,则将执行对应method。
若载BeanPostProcessor(),执⾏ postProcessBeforeInitialization() 。
如有实现InitializingBean ,行 afterPropertiesSet()
配置⽂件有定义,相关 init-method 属性的,则将执⾏指定⽅法。
如有加载BeanPostProcessor 对象,执⾏ postProcessAfterInitialization() ⽅法
————这里就可以使用这个bean了————
-
销毁:
如果实现DisposableBean 接⼝,执⾏ destroy() ⽅法。
配置⽂件有定义,相关 destroy-method 属性的,执⾏指定的⽅法。