spring bean的生命周期面试如何回答_面试maven的生命周期

spring bean的生命周期面试如何回答_面试maven的生命周期SpringBean生命周期

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

面试中经常会被问到Spring Bean的生命周期,有些人说记不住,看了一遍源码也是云里雾里的,那是因为只看理论,没有自己实践,如果自己亲自写代码验证一下,不管是对Spring的宏观感受,还是微观的感觉,都会有进一步的理解。
本篇会先展示代码的结果,后面再进行分析,代码的获取地址:码云地址

1、测试结果演示

Spring容器初始化===========================
五月 16, 2020 3:18:44 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@13b6d03: startup date [Sat May 16 15:18:44 CST 2020]; root of context hierarchy
五月 16, 2020 3:18:45 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
【步骤1】执行Bean的无参构造函数
【步骤2】执行Bean的set方法,设置name属性值:coolsummermoon
【步骤2】执行Bean的set方法,设置sex属性值:man
【步骤3】执行BeanNameAware中setBeanName方法,beanName值:iocBeanLifeService
【步骤4】执行BeanClassLoaderAware中setBeanClassLoader,ClassLoader的name = sun.misc.Launcher$AppClassLoader
【步骤5】执行BeanFactoryAware中setBeanFactory,beanFactory中是否包含IocBeanLifeServicetrue
【步骤6】执行EnvironmentAware的setEnvironment方法
【步骤7】执行ResourceLoaderAware的setResourceLoader方法,Resource File Name=applicationContext.xml
【步骤8】执行ApplicationEventPublisherAware中setApplicationEventPublisher方法
【步骤9】执行ApplicationContextAware的setApplicationContext方法,Bean Definition Names=[iocBeanLifeService, org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0, ioc.CustomerBeanPostProcessor#0]
【步骤10】执行BeanPostProcessor中postProcessBeforeInitialization方法,beanName=iocBeanLifeService
【步骤11】执行PostConstruct注解标注的方法
【步骤12】执行InitializingBean的afterPropertiesSet方法
【步骤13】执行配置的init-method
【步骤14】执行BeanPostProcessor的postProcessAfterInitialization方法,beanName=iocBeanLifeService
五月 16, 2020 3:18:45 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@13b6d03: startup date [Sat May 16 15:18:44 CST 2020]; root of context hierarchy
Spring容器初始化完毕========================
从容器中获取Bean
IocBeanLifeService{ 
   name='coolsummermoon', sex='man'}
Spring容器准备关闭==========================
【步骤15】执行preDestroy注解标注的方法
【步骤16】执行DisposableBean接口的destroy方法
【步骤17】执行配置的destroy-method
Spring容器完成关闭===========================

Process finished with exit code 0

2、结果分析

2.1、上面的结果,我们可以初步分四个阶段:

  1. Bean的实例化阶段
  2. Bean的设置属性阶段
  3. Bean的 初始化阶段
  4. Bean的销毁阶段

2.2、在初始化阶段,有个特别重要的接口BeanPostProcessor,在初始化前、后调用:
在这里插入图片描述
2.3、在设置属性阶段后,postProcessBeforeInitialization方法执行前,会执行很多Aware类型的接口,这种类型接口作用是加载资源到Spring容器中,Aware前面的名字就对应哪种资源,依次加载的是:

  1. BeanNameAware
  2. BeanClassLoaderAware
  3. BeanFactoryAware
  4. EnvironmentAware
  5. ResourceLoaderAware
  6. ApplicationEventPublisherAware
  7. ApplicationContextAware

看到这里应该明白BeanFactory和ApplicationContext的区别了:
BeanFactoryAware之前加载的资源都是公共的。BeanFactoryAware后面加载的资源都是ApplicationContext独有的。

2.4、初始化方式有三个,分别是:

  1. InitializingBean的afterPropertiesSet方法
  2. PostConstruct注解标注的方法
  3. 配置的init-method

上面的三个方法效果都是一样的,开发中选择其中一种方式就行,一般我们选择2、3方法中的一个。

2.5、容器销毁的方式有三个,分别是:

  1. preDestroy注解标注的方法
  2. DisposableBean接口的destroy方法
  3. 配置的destroy-method

上面的三个方法效果都是一样的,开发中选择其中一种方式就行,一般我们选择1、3方法中的一个。

3、总结

综合前面的代码和分析,现在我们用大白话描述下:

  1. Bean容器找到Spring配置文件中Bean的定义;
  2. Bean容器利用java 反射机制实例化Bean;
  3. Bean容器为实例化的Bean设置属性值;
  4. 如果Bean实现了BeanNameAware接口,则执行setBeanName方法;
  5. 如果Bean实现了BeanClassLoaderAware接口,则执行setBeanClassLoader方法;
  6. 如果Bean实现了BeanFactoryAware接口,则执行setBeanFactory方法;
  7. 如果 ……真的,到这我经常忘记,但前面三个Aware接口肯定能记住;
  8. 如果Bean实现了ApplicationContextAware接口,则执行setApplicationContext方法;
  9. 如果加载了BeanPostProcessor相关实现类,则执行postProcessBeforeInitialization方法;
  10. 如果Bean定义初始化方法(PostConstruct注解、配置init-method、实现了InitializingBean接口),则执行定义的初始化方法;
  11. 如果加载了BeanPostProcessor相关实现类,则执行postProcessAfterInitialization方法;
  12. 当要销毁这个Bean时,如果自定义了销毁方法(PreDestroy注解、配置destroy-method、实现了DisposableBean接口),则执行定义的销毁方法。

结束语

留一个思考题:作用域是单例和原型的Bean,Spring对其生命周期是如何管理的?

欢迎大家关注下方微信公众号,我们一起讨论技术、理财方面的知识,解决生活中遇到的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191669.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 验证Hibernate二级缓存的存在[通俗易懂]

    验证Hibernate二级缓存的存在[通俗易懂]一、环境的搭建请参考EHcache环境的配置二、实体类(Student.java)packagecom.hibernate.beans;publicclassStudent{privateIntegerid;privateStringname;privateintage;privatedoublescore;publicStu

    2022年5月10日
    38
  • 激活成功教程无线网络密码-BT3如何使用3

    激活成功教程无线网络密码-BT3如何使用3BT3虚拟机SNOOPWEP2激活成功教程无线网络WEP密钥图解1.下载BT3光盘映像文件(ISO格式),比如:bt3-final.iso;用WinISO或UltraISO(这个还支持DVD

    2022年7月4日
    23
  • batch内负采样

    batch内负采样一般在计算softmax交叉熵时,需要用tf.nn.log_uniform_candidate_sampler多itemid做随机负采样。但是在类似dssm这种双塔模型中,item侧特征除了itemid外,还有其他meta特征,此时负样本对itemid做负采样后,还需要取相应负样本的meta特征。可是在tf训练数据中并不方便建立itemid与各类meta特征的映射表。为了解决dssm类模型的负采样问题,可以取一个batch内其他用户的正样本做为本用户的负样本,以解决负采样meta特征问题。好了,废话少说,

    2022年6月23日
    62
  • python视频网站项目_价值2400元的python全栈开发系列Flask Python Web 网站编程视频

    python视频网站项目_价值2400元的python全栈开发系列Flask Python Web 网站编程视频2e/b4F1c’H$D!X价值2400元的python全栈开发系列FlaskPythonWeb网站编程视频-优品课堂’z3_1Y7]6j4z#p#r#g*A9e8k5h’V7w,M$f6C6X*e”J2N课程目录:%v2_&D+L5_)a$L;C.C01-计算机基础常识.mp49T,_9X9p+y4B7…

    2022年5月7日
    41
  • jmeter对接口进行压测_jmeter接口压测流程详解

    jmeter对接口进行压测_jmeter接口压测流程详解macjmeter压测工具的安装

    2022年10月28日
    0
  • Python五子棋人机对战

    Python五子棋人机对战了解过python的都知道python最高境界就是人工智能,AI技术,but但凡接触到AI那都感觉很高大上的,新手小白肯定看不懂…别急,我给大家带来了一个伪AI技术,注释也写的很明白,保证小白都能一看就懂!!!!唔,是的,伪AI技术,人机五子棋。(跟电脑下棋)实现一个人就可以跟电脑下棋。具体怎么让电脑产生攻击力的…代码的注释写的很清楚。。。。话不多说,那就上码吧。”””五子棋之人机对战”””importsysimportrandomimportpygamefrom

    2022年6月16日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号