前几天在阿粉CSDN上看一个文章,因为一个Spring的问题,期望薪资三万却被生生的压榨成了两万五,高于两万五人家都不要,让我感觉到了Spring的强大,不学习Spring是会吃亏的,那么我们就从各种高频面试来一点点深入吧。
今天阿粉给大家带来的是关于Spring的另外的一道高频面试题,而且是非常非常高频的面试题,那就是Spring中的Bean的生命周期。
1.Bean的生命周期
关于Bean的生命周期,如果我们不谈这个Spring的话,实际上很多人都会想到New,通过 New 对象的形式来实现对 Bean的实例化操作,而在我们不再使用 Bean 了之后,这时候我们的 Java 就会对这个指定的 Bean 来进行垃圾回收了。
但是对于Spring来说,Bean的生命周期可能就比较让人头疼了,毕竟 Spring 这么复杂,而且里面的对 Bean 管理的非常的有逻辑了,每一层都有每一层的步骤。
如果现在我们去百度上面去搜索所有的关于Spring的Bean的生命周期,很多人会把这个解释出来
- 在IoC容器启动之后,并不会马上就实例化相应的bean,此时容器仅仅拥有所有对象的BeanDefinition(BeanDefinition:是容器依赖某些工具加载的XML配置信息进行解析和分析,并将分析后的信息编组为相应的BeanDefinition)。只有当getBean()调用时才是有可能触发Bean实例化阶段的活动
而有一些内容就不会说解释的很透彻,比如说为什么说只有当 getBean() 调用的时候才有可能触发Bean的实例化。
2.生命周期流程图
2.1简化版图解
而这图解中,把 Spring 中 Bean 的生命周期分成了好几个步骤,分别是:
-
通过构造方法实例化 Bean 对象。
-
通过 setter 方法设置对象的属性。
-
通过Aware,也就是他的子类BeanNameAware,调用Bean的setBeanName()方法传递Bean的ID(XML里面注册的ID),setBeanName方法是在bean初始化时调用的,通过这个方法可以得到BeanFactory和 Bean 在 XML 里面注册的ID。
-
如果说 Bean 实现了 BeanFactoryAware,那么工厂调用setBeanFactory(BeanFactory var1) 传入的参数也是自身。
-
把 Bean 实例传递给 BeanPostProcessor 中的 postProcessBeforeInitialization 前置方法。
-
完成 Bean 的初始化
-
把 Bean 实例传递给 BeanPostProcessor 中的 postProcessAfterInitialization 后置方法。
-
此时 Bean 已经能够正常时候,在最后的时候调用 DisposableBean 中的 destroy 方法进行销毁处理。
而阿粉觉得如果面试官在面试的时候问到这个问题的时候,你从图解开始入手,然后把这些都说给他之后,那么相对应的,这现在这些答案,如果不继续的深挖内容,可能已经就足够了。
而接下来还要从根本上来论证阿粉所写的内容。
而我们对这详细的可能有时候难以记忆,可能还是理解不深,而我们可以从四到五个方面来记忆,
- 构造实例化
- 属性赋值
- 完成初始化
- (前后处理)
- 使用后销毁
而从这五个方面来记忆,或许就能把这个图扩展开,从而言简意赅的回答面试官的问题。
代码验证
1 |
|
Main方法
1 |
|
运行结果展示
1 |
|
和大家预想的是不是一样的呢? 在用案例回答面试官之后,我们最好还是要研究一下源码的部分,毕竟研究清楚了,会理解的更深刻不是么?
InstantiationAwareBeanPostProcessor
这个类是继承的 BeanPostProcessor 而这个类的作用是什么呢?源码注释解释的是这样子的:
方法一:
1 |
|
也就是说postProcessBeforeInstantiation在bean实例化之前调用的,这是不是也是我们在面试中另外的一个面试点 AOP 的使用呢?到时候面试官让你举例子的时候,你直接用这个 Spring 里面的源码给他解释,分分钟让面试官对你刮目想看呀有木有。
方法二: 可以看到该方法在属性赋值方法内,但是在真正执行赋值操作之前。其返回值为boolean。
1 |
|
大家是不是还可以这么理解,如果返回值为false的话,那么就出现了赋值失败,也就是间接阻断赋值了。
而初始化的类同样的 BeanPostProcessor
方法一:
1 |
|
方法二:
1 |
|
同样注释翻译出来的意思也是很明确的,这也是阿粉为什么喜欢自己下载个插件去看注释,毕竟源码这个东西如果看别人理解的和自己理解的,有时候差距也是很大的。
关于这个SpringBean的高频面试题,你会回答了么?
文献参考
《Spring源码深度解析》
代码参考
Spring 了解Bean的一生(生命周期)