点击下方链接回顾往期

不要再说不会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. centos7下面 es7.5 搭建

    centos6 搭建 参考 https://www.cnblogs.com/php-linux/p/8758788.html 搭建linux虚拟机 https://www.cnblogs.com/ph ...

  2. spring boot:用itextpdf处理pdf表格文件(spring boot 2.3.2)

    一,什么是itextpdf? 1,itextpdf的用途 itextpdf是用来生成PDF文档的一个java类库, 通过iText可以生成PDF文档, 还可以把XML/Html文件转化为PDF文件 2 ...

  3. js改变,设置table单双行颜色,jquery改变,设置table单双行颜色

    1.js实现单双行以不同颜色显示 $(document).ready(function () { var color = "#ffeab3"; $("#GvList tr ...

  4. win8怎样才能启用administrator登录 别的用户也是如此

    但是你可以用命令调出administrator账户打开C盘,打开windows文件夹,再打开system32文件夹,找到cmd.exe右键点击选择以管理员身份运行 在里面输入net user admi ...

  5. cve-2020-1472,netlogon特权提升漏洞复现

    cve-2020-1472,netlogon特权提升漏洞, 漏洞原理:攻击者通过NetLogon(MS-NRPC),建立与域控间易受攻击的安全通道时,可利用此漏洞获取域管访问权限.成功利用此漏洞的攻击 ...

  6. python numpy输出排名

    python numpy排序后输出排名 问题: 假设某班的成绩为: 姓名 成绩 名次 小红 95 小黑 67 小白 58 小绿 82 小蓝 76 小橙 79 小可爱 99 请根据表格,输出对应的名次 ...

  7. 解决Java连接Oracle 12c存在的问题

    感谢作者 原文链接:https://blog.csdn.net/peng_wei_kang/article/details/80403486 1.发现项目报以下错误:   Caused by: jav ...

  8. Spring+Hibernate+Struts2整合之实现登录功能

    前端代码: <form id="loginForm" action="${ pageContext.request.contextPath }/user_login ...

  9. C. Vladik and Memorable Trip 解析(思維、DP)

    Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...

  10. Jenkins自动化构建PHP实列教程

    安装Jenkins 请参考群主的安装教程 进入jenkins,添加SSH server,并且安装gitlab,Generic Webhook Trigger Plugin,GitHub plugin, ...