点击下方链接回顾往期
不要再说不会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进行注入
@Bean
public Trans trans() {}
② 在实体类Trans中,通过注解@Component进行注入
@Component
pubic 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高阶开发有兴趣的小伙伴,可以添加享学班主任:嵩嵩老师的微信号进行咨询啦~记得一定要说是从我这边了解的哟,享优惠福利~