点击下方链接回顾往期
不要再说不会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高阶开发有兴趣的小伙伴,可以添加享学班主任:嵩嵩老师的微信号进行咨询啦~记得一定要说是从我这边了解的哟,享优惠福利~