面试知识点总结之SpringBean的生命周期管理

理解SpringBean的生命周期可以让你更好的掌控自己的项目:
首先要知道的是普通Java对象和Spring所管理的Bean实例化的过程是有些区别的。
在普通的Java环境下创建对象简单的步骤可以分为以下几步:

Java源码被编译为class文件 2. 等到类需要被初始化的时(比如new,反射等) 3. class文件被虚拟机通过类加载器加载到JVM 4. 初始化对象供我们使用
简单来说,可以理解为它是用class对象作为【模板】进而创建具体的实例
而Spring所管理的Bean不同的是,除了class对象外,还会使用BeanDefinition的实例来描述对象的信息
比如说,我们可以在Spring所管理的bean有一系列的描述:@Scope @Lazy @DependsOn等等
可以理解为:Class只描述了类的信息,而BeanDefinition描述了对象的信息

Spring在启动的时候需要【扫描】在XML/JavaConfig中需要把这些信息放到一个beanDefinitionMap中;这个Map的key是beanName,value是BeanDefinition对象
到这里就是把定义的元数据加载起来,目前真实对象还没有实例化

接着会遍历这个beanDefinitionMap,执行BeanFactoryPostProcessor这个Bean工厂后置处理器的逻辑
比如说,我们平时定义的占位符信息,就是通过BeanFactoryPostProcessor的子类PropertyPlaceholderConfigurer进行注入进去
当然了,这里我们也可以自定义BeanFactoryPostProcessor来对我们自定义好的Bean元数据进行获取和修改
只是我们一般不会这么干,实际上也很少使用场景
BeanFactoryPostProcessor后置处理器执行完了以后就到了实例化对象啦

在Spring里边是通过反射来实现的,一般情况下会通过反射选择合适的构造器来把对象实例化
这里把对象实例化,只是把对象给创建出来,而对象具体的属性是还没有注入的

比如我的对象是UserService,而UserService对象依赖者SendService对象,这时候的SendService还是Null的,所以下一步就是把对象的相关属性给注入
相关属性注入之后,往下接着就是初始化的工作了

首先判断该Bean是否实现了Aware相关的接口,如果存在则填充相关的资源
比如我这边项目用到的:希望通过代码程序的方式去获取指定的SpringBean
我们这边会抽取一个工具类,去实现ApplicationContextAware接口,来获取ApplicationContext对象进而获取SpringBean
Aware相关的接口处理完之后,就会到BeanPostProcessor后置处理器啦

BeanPostProcessor后置处理器有两个方法,一个是before,一个是after,肯定是before先执行after后执行
这个BeanPostprocessor后置处理器是AOP实现的关键
关键子类AnotationAwareAspectJAutoCreator
所以执行完Aware相关的接口就会执行BeanPostProcessor相关子类的before方法

BeanPostProcessor相关子类的before方法执行完,则执行init相关的方法,比如说@PostConstruct,实现了InitializingBean接口,定义的initmethod方法
官网上他们被调【执行顺序】分别是:@PostConstruct,实现了InitializingBean接口以及init-method方法
这些都是Spring给我们的【扩展】像@postConstruct我就经常用到
比如说:对象实例化后,我要做些初始化相关的工作或者就启个线程去kafka拉取数据
等到init方法执行完之后,就会执行BeanPostProcessor的After方法

基本重要的流程已经走完了,我们就可以获取到对象去使用了
销毁的时候就看有没有配置相关的destory方法,执行就可以了

摘自微信公众号Java3y;

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注