点击下方链接回顾往期

不要再说不会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在容器中注册组件有哪些方式的,可以参考上一篇文章进行详细深入的了解,点击下方链接跳转观看:

《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调用之前使用);

② postProcessAfter​Initalization():在初始化之后进行后置处理工作,比如在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的生命周期,学会后让面试官无话可说!的更多相关文章

  1. java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式

    Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...

  2. Spring 使用介绍(十三)—— Bean的生命周期

    一.概述 Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,生命周期时序图如下: 二.生命周期接口分类 Bean的生命周期经历了多个接口方法的调用, ...

  3. Spring Bean的生命周期、后置处理器、定义继承

    目录: 了解Spring的基本概念 Spring简单的示例 Spring Bean的定义及作用域 1.Bean的生命周期 Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Be ...

  4. Spring基础学习(二)—详解Bean(上)

         在Spring配置文件中,用户不但可以将String.int等字面值注入Bean中,还可以将集合.Map等类型注入Bean中,此外还可以注入配置文件中其他定义的Bean. 一.字面值     ...

  5. 详解Vue2.0生命周期

    网上已经有很多关于vue生命周期的文章,我的这篇文章的由来,其实是我对官网上描述的一句话的思考与理解:“el被新创建的vm.$el替换”,所以文章更多的内容可能是在对vue生命周期中“created ...

  6. 详解 Android Activity 生命周期

    从以下几个方面详细说一下Activity的生命周期: 1.回到主屏幕再打开和退出程序的时候. 2.屏幕旋转的时候. 3.打开其它的Activity的情况. 4.打开一个Layou透明的Activity ...

  7. 【Android基础】Fragment 详解之Fragment生命周期

    上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的 ...

  8. 详解React的生命周期

    React生命周期 之前自己在学习React的时候,只是简单的理解了生命周期有这么一些,但是不知道大概的一个流程是怎么样的.那天在面试的时候,问到了.自己也有点懵,也没提前看,不过还是答上来了一些,这 ...

  9. 详解Android Activity生命周期

    转载注明来自:  http://www.cnblogs.com/wujiancheng/ 一.正常情况下Activity的生命周期:  Activity的生命周期大概可以归为三部分 整个的生命周期:o ...

随机推荐

  1. TCP/IP的十个问题

    一.TCP/IP模型 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的 ...

  2. Java中try()...catch()用法

    在stackoverflow偶尔看到的一个关于try()...catch()的用法,通常我们使用try...catch()捕获异常的,如果遇到类似IO流的处理,要在finally部分关闭IO流,当然这 ...

  3. Java中四舍五入保留两位小数

    Java中四舍五入保留两位小数 方法一 四舍五入 double f = 3.15; long res = Math.round(f); #结果 res = 3 保留两位小数 double f = 3. ...

  4. GitHub如何删除项目库Repositories

    1.在头像那里找到settings按钮 2.选择repositories 3.找到你要删除的项目 4.点击settings 5.滑到页面最下面,点击delete 7.输入项目名称,复制即可 8.删除后 ...

  5. Java线程池的四种创建方式

    Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFix ...

  6. linux压缩和解压文件命令

    tar  解包:tar zxvf filename.tar  打包:tar czvf filename.tar dirnamegz命令  解压1:gunzip filename.gz  解压2:gzi ...

  7. 20202427-张启辰《Python3初学:罗马数字转阿拉伯数字》

    目录 20202427-张启辰<Python3初学:罗马数字转阿拉伯数字> 1.规则 2.局限性 3.Python3解决 20202427-张启辰<Python3初学:罗马数字转阿拉 ...

  8. Linux下如何使用X86 CPU的GPIO

    目录 1.前言 2.linux pinctrl子系统 3. pin controller driver 4.手动构造device 1.前言 在arm嵌入式开发中,各个外设具有固定的物理地址,我们可以直 ...

  9. Luogu P4546 [THUWC2017]在美妙的数学王国中畅游

    题意 题意奇奇怪怪,这里就不写了. \(\texttt{Data Range:}1\leq n\leq 10^5,1\leq m\leq 2\times 10^5\) 题解 为什么你们都是卡在数学方面 ...

  10. 怎么解决Git中出现 "LF will be replaced by CRLF" 警告

    Windows中使用CRLF标识一行的结束,而在Linux/UNIX系统中只使用LF标识一行的结束.CRLF即Carriage-Return Line-Feed的缩写.通常情况下,Git库不会自动修改 ...