spring bean的生命周期面试如何回答_面试maven的生命周期
摘要: [步骤1]执行Bean的无参数构造函数,[步骤2]执行Bean的set方法,执行ClassLoader的name=sunn.misc.Launcher$AppClassLoader:[步骤5]执行beanfactoryAware中的setbeanfactory:[步骤6]执行EnvironmentAware的setEnvironment方法
前言
面试中经常会被问到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中是否包含IocBeanLifeService:true
【步骤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、上面的结果,我们可以初步分四个阶段:
- Bean的实例化阶段
- Bean的设置属性阶段
- Bean的 初始化阶段
- Bean的销毁阶段
2.2、在初始化阶段,有个特别重要的接口BeanPostProcessor,在初始化前、后调用:
2.3、在设置属性阶段后,postProcessBeforeInitialization方法执行前,会执行很多Aware类型的接口,这种类型接口作用是加载资源到spring容器中,Aware前面的名字就对应哪种资源,依次加载的是:
- BeanNameAware
- BeanClassLoaderAware
- beanfactoryAware
- EnvironmentAware
- ResourceLoaderAware
- ApplicationEventPublisherAware
- ApplicationContextAware
看到这里应该明白beanfactory和ApplicationContext的区别了: beanfactoryAware之前加载的资源都是公共的。beanfactoryAware后面加载的资源都是ApplicationContext独有的。
2.4、初始化方式有三个,分别是:
- InitializingBean的afterPropertiesSet方法
- postconstruct注解标注的方法
- 配置的init-method
上面的三个方法效果都是一样的,开发中选择其中一种方式就行,一般我们选择2、3方法中的一个。
2.5、容器销毁的方式有三个,分别是:
- preDestroy注解标注的方法
- disposableBean接口的destroy方法
- 配置的destroy-method
上面的三个方法效果都是一样的,开发中选择其中一种方式就行,一般我们选择1、3方法中的一个。
3、
我来说两句