(这个文章根据抖音的文艺TOM博主抄的,觉得挺好,可以背背,当成面试用,另外我加了一点点)
Spring的生命周期被分为五个阶段:
- 创建前准备阶段
- 创建实例阶段
- 依赖注入阶段
- 容器缓存阶段
- 销毁实例阶段
创建前准备阶段
这个阶段主要是开始bean加载之前,从spring上下文中去获取相关的配置并且解析,然后找到bean有关的一些配置内容,比如说init-method,容器在初始化bean的时候去调用这个方法,destory-method容器在销毁bean的时候去调用这个方法,以及BeanFactoryPostProcessor这个类的Bean加载过程中前置和后置的处理.这些类或者配置其实是spring提供给开发者用来实现bean加载过程中的一个扩展机制.在很多与spring集成的一些中间件框架也经常使用到,比如说dubbo.
创建实例阶段
这个阶段主要是通过反射去创建bean实例对象,并且扫描和解析bean的声明的一些属性.
依赖注入阶段
这个阶段会监测被实例化的bean是否会存在其他依赖,如果存在其他依赖,就需要将这些依赖注入到bean里面,比如说通过读取注解@Autowired和@Setter等注解去完成依赖注入的配置,这个阶段又会触发一些扩展的调用,比如说常见的扩展类BeanPostProcessors,会调用其前置处理postProcessBeforeInitialization,主要是对bean进行一些扩展,如SpringAOP;再比如InitializingBean,这个类里面有一个afterPropertiesSet方法,它给属性去赋值.
其次还会调用一些xxxAware接口:
- 如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
- 如果 Bean 实现了 BeanClassLoaderAware 接口,则 Spring 调用 setBeanClassLoader() 方法传入classLoader的引用。
- 如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
- 还有其他一些诸如 EnvironmentAware ,EmbeddedValueResolverAware等接口
容器缓存阶段
这个阶段主要是将bean保存在IOC容器中缓存起来,如果是默认的单例bean,就会缓存起来,如果是设置多力bean,该bean会交给用户去管理,到了这个阶段,bean就可以去被开发者使用了,那么这个阶段涉及到的操作有,常见的init-method属性配置的方法会在这个阶段被调用,比如说BeanPostProcessors类的后置处理方法,如postProcessAfterInitialization.
销毁实例阶段
这个阶段是完成spring应用上下文的时候,将去销毁spring上下文中所有bean,如果bean实现了DisposableBean接口的话,或者配置了destory-method属性的方法都将在这个阶段被调用.