Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

点击下方链接回顾往期
不要再说不会Spring了!Spring第一天,学会进大厂!
Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
今天讲解Spring中Bean的生命周期。通过代码案例 + 源码的方式,用图文结合的方式来讲解Bean的生命周期。希望这一篇看过后,小伙伴后续面试中遇到该类问题,让面试官无话可说!
一 、Bean的生命周期
首先我们来了解下bean的生命周期:
bean创建 --> 初始化 --> 销毁
bean的生命周期是由IOC容器进行管理。我们也可以自定义bean的初始化和销毁方法:当容器在bean进行到当前生命周期时,来调用自定义的方法进行初始化和销毁。
接下来将介绍 4 种方式来介绍自定义初始化和销毁的方法:
首先,我们了解一下,在以前很早项目中,项目中的配置文件都在bean.xml文件中,我们可以指定init-method 和 destory-method来进行初始化和销毁。但是在目前的项目中,基本上不在xml文件中进行定义。在这里也通过下列代码了解一下xml中自定义初始化和销毁的方式:

在这里将不再介绍更多xml中更多的介绍,下面将介绍如何通过注解的方式来自定义初始化和销毁的方法。
1. 在配置类MainConfig.java中,通过:
@Bean(initMethod = "init", destoryMethod = "destory")指定初始化(init) 和 销毁(destory)方法
首先建立实体类Bike.java类

配置类MainConfig.java类

可以看到,在@Bean注解中,可以通过initMethod 和 destoryMethod 两种方式,自定义初始化 和 销毁方法。
我们来看下@Bean中的源码:

可以发现,@Bean中包含了initMethod 和 destoryMethod的抽象方法,因此第一种方式可以通过@Bean中initMethod 和 destoryMethod方式自定义初始化和销毁方法。
测试一下:

可以看到
① 通过引入initMethod初始化方法,在IOC容器创建完成之前就进行了初始化。
② 通过引入destoryMethod销毁方法,当容器关闭后(调用app.close()),会调用destory方法进行销毁
2. 让Bean实现InitalizingBean 和 DisposableBean接口
定义实体类Train.java类实现InitalizingBean 和 DisposableBean接口,并分别实现:
afterPropertiesSet() 和 destory() 方法

配置类中可以通过下面三种方式加载bean:
① 在配置类中定义Trans()方法,通过注解@Bean进行注入
@Beanpublic Trans trans() {}
② 在实体类Trans中,通过注解@Component进行注入
@Componentpubic class Trans {}
③ 在配置类上,通过加上扫描@ComponentScan("com.enjoy.bean")方式进行注入
@ComponentScan("com.enjoy.bean")public class MainConfig {}
通过上面三种方式可以将bean进行注入,如果还不明确Spring在容器中注册组件有哪些方式的,可以参考上一篇文章进行详细深入的了解,点击下方链接跳转观看:
测试类测试:

可以看到测试打印结果如上图,通过实现实现InitalizingBean 和 DisposableBean接口,即可在容器加载和关闭时进行初始化和销毁操作。
3. 使用JSR250规则(Java规范)定义的两个注解来实现在容器中的初始化和销毁
① @PostConstruct:在Bean创建完成,且属于赋值完成后进行初始化,属于JDK规范的注解
② @PreDestory:在bean被移除之前进行通知,在容器销毁之前进行清理工作
新建实体类Jeep.java类

测试类测试:

可以看到测试打印结果如上图,可以通过使用JSR250规则(Java规范)定义的两个注解来实现在容器中的初始化和销毁。
接下来介绍第四种方式,也是一种后置处理器的方式,负责在初始化方法前后作用
4. 实现BeanPostProcessor接口类
BeanPostProcessor接口类:bean的后置处理器,在bean初始化之前调用进行拦截。
作用:
① postProcessBeforeInitalization():在初始化之前进行后置处理工作(在init-method之前)。什么时候调用:它在任何初始化方法调用之前(比如在InitalizingBean的afterPropertiesSet初始化之前,或者自定义init-method调用之前使用);
② postProcessAfterInitalization():在初始化之后进行后置处理工作,比如在InitlizingBean的afterPropertiesSet()。
新建后置处理器类:

测试类测试:

可以看到测试打印结果如上图,以Jeep实体类初始化实例为例,在Jeep初始化方法前后分别调用了后置处理器postProcessBeforeInitialization 和 postProcessAfterInitialization方法。并在容器关闭后,销毁了Jeep的bean对象。
通过以上四种方式介绍了bean的初始化和销毁的方式。有兴趣的小伙伴可以自行设计并验证。了解了bean的生命周期,以及bean的初始化和销毁的四种方式,基本上可以在面试中无压力输出。面试官也无话可说,至于是否会深入源码,小伙伴可通过代码追本溯源去更深研究源码的实现,其实最终就是定位到底层的一个实现类中,关注公众号《Spring专题系列》,后续会更深入的去研究和介绍。
编后语:
最近一直想要从某个专题切入,对某个专题进行深入详细的了解,作为开发人员,都或多或少的想了解一下代码底层的原理及思想,公众号【Java极客思维】经历几次更名,最终也敲定【Java极客思维】作为公众号的名称,极客:随着互联网文化的兴起,这个词含有智力超群和努力的意思,又被用于形容对计算机和网络技术有狂热兴趣并投入大量时间钻研的人。现代的Geek含义虽然与过去有所不同,但大多仍相似,Geek更多是指在互联网时代创造全新的商业模式、尖端技术与时尚潮流的人。总之,是一群以创新、技术和时尚为生命意义的人,这群人共同地战斗在新经济、尖端技术和世界时尚风潮的前线,共同为现代的电子化社会文化做出自己的贡献。
作者Cansluck作为6年开发工作人员,之前一直都是零碎的在整理知识碎片,通过享学IT课堂的学习,通过系统性、框架性的学习,对Java这门语言也有了深刻的理解,这次也想借此契机,先从《Spring系列专题》做起,希望能够让更多的小伙伴能够通过公众号分享的文章能够在Java开发的技术路线上走的更远!
最后,感谢享学IT课堂的各位老师的辛苦分享,以及班主任小姐姐孜孜不倦,持之以恒的催着我们上课。
希望有更多的小伙伴能够加入我们这个Java开发阵营,共同进步,共同发展。码字、分享不易,且行且珍惜,不如借此机会,关注公众号呀~
原文链接:Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!

Java极客思维
微信扫一扫,关注公众号
如果对Java高阶开发有兴趣的小伙伴,可以添加享学班主任:嵩嵩老师的微信号进行咨询啦~记得一定要说是从我这边了解的哟,享优惠福利~

Spring第三天,详解Bean的生命周期,学会后让面试官无话可说!的更多相关文章
- java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式
Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...
- Spring 使用介绍(十三)—— Bean的生命周期
一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ...
- Spring Bean的生命周期、后置处理器、定义继承
目录: 了解Spring的基本概念 Spring简单的示例 Spring Bean的定义及作用域 1.Bean的生命周期 Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Be ...
- Spring基础学习(二)—详解Bean(上)
在Spring配置文件中,用户不但可以将String.int等字面值注入Bean中,还可以将集合.Map等类型注入Bean中,此外还可以注入配置文件中其他定义的Bean. 一.字面值 ...
- 详解Vue2.0生命周期
网上已经有很多关于vue生命周期的文章,我的这篇文章的由来,其实是我对官网上描述的一句话的思考与理解:“el被新创建的vm.$el替换”,所以文章更多的内容可能是在对vue生命周期中“created ...
- 详解 Android Activity 生命周期
从以下几个方面详细说一下Activity的生命周期: 1.回到主屏幕再打开和退出程序的时候. 2.屏幕旋转的时候. 3.打开其它的Activity的情况. 4.打开一个Layou透明的Activity ...
- 【Android基础】Fragment 详解之Fragment生命周期
上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的 ...
- 详解React的生命周期
React生命周期 之前自己在学习React的时候,只是简单的理解了生命周期有这么一些,但是不知道大概的一个流程是怎么样的.那天在面试的时候,问到了.自己也有点懵,也没提前看,不过还是答上来了一些,这 ...
- 详解Android Activity生命周期
转载注明来自: http://www.cnblogs.com/wujiancheng/ 一.正常情况下Activity的生命周期: Activity的生命周期大概可以归为三部分 整个的生命周期:o ...
随机推荐
- python抓取动态验证码,具体第几帧数的位置静态图片
一.代码+注解 import os from PIL import Image import requests import io def save_img(): headers = { 'User- ...
- 如何解决json返回的乱码
方法一: 通过@RequestMaping的produces属性来实现,修改下代码 //produces:指定响应体返回类型和编码@RequestMapping(value = "/xxx& ...
- Hibernate注解实体类
Hibernate注解1.@Entity(name="EntityName")必须,name为可选,对应数据库中一的个表2.@Table(name="",cat ...
- Spring Boot学习笔记(一)——Eclipse安装STS插件
一.简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配 ...
- Python ( 高级 第二部)
目录 模块和包 面向对象 部分一: 面向对象程序开发 面向对象封装: 对象的相关操作 面向对象封装: 类的相关操作 实例化的对象/ 定义的类删除公有成员属性和公有成员方法 部分二: 单继承 多继承 菱 ...
- php socket通信的简单实现
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- C++代码雨
闲逛的时候发现了一个很好玩的程序 摘自:https://blog.csdn.net/u012837895/article/details/20849967#comments 效果如下 #include ...
- AtCoder Beginner Contest 181 题解
总结 第一次 \(AK\ ABC\) 的比赛,发一个截图纪念一下 A - Heavy Rotation 题目大意 一个人一开始穿白衣服,一天后换成黑衣服,再过一天又换成白衣服,问第 \(n(n \le ...
- MobileNet——一种模型轻量化方法
导言 新的CNN网络的提出,提高了模型的学习能力但同时也带来了学习效率的降低的问题(主要体现在模型的存储问题和模型进行预测的速度问题),这使得模型的轻量化逐渐得到重视.轻量化模型设计主要思想在于设计更 ...
- uniapp微信小程序canvas隐藏
HTML 我是把canvas嵌套在view里并被view设置id <view id="canvas"> <canvas style="width: 35 ...