首页>>后端>>Spring->Spring中Bean的生命周期

Spring中Bean的生命周期

时间:2023-11-29 本站 点击:0

在Spring中,一个Bean的生命周期要经过很长的一段步骤,这也是面试中的高频考点,下面就一起来看看吧。

首先整体地梳理一下Bean的生命周期:

创建Bean实例

调用Bean中的setter()方法设置属性值

检查Bean是否实现了Aware接口,若实现了,则调用对应的接口方法

若容器中有BeanPostProcessor,则调用其postProcessAfterInitialization

检查Bean是否实现了InitializingBean,若实现了,则调用其afterPropertiesSet方法

检查是否指定了Bean的init-method属性,若指定了,则调用其指定的方法

若容器中有BeanPostProcessor,则调用其postProcessorAfterInitialization

检查Bean是否实现了DisposableBean,若实现了,则调用其方法

检查是否指定了Bean的destroy-method属性,若指定了,则调用其指定的方法

一个Bean的生命周期共需要经历上述的9个过程,如图所示:

下面通过具体的程序来测试一下,首先编写一个Bean:

publicclassUserimplementsApplicationContextAware,InitializingBean,DisposableBean{privateStringname;privateIntegerage;publicUser(){System.out.println("1--》创建User实例");}publicvoidsetName(Stringname){this.name=name;System.out.println("2--》设置User的name属性");}publicvoidsetAge(Integerage){this.age=age;System.out.println("2--》设置User的age属性");}publicvoidinit(){System.out.println("6--》调用init-method属性指定的方法");}publicvoidmyDestroy(){System.out.println("9--》调用destroy-method属性指定的方法");}@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{System.out.println("3--》调用对应Aware接口的方法");}@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println("5--》调用InitializingBean接口的afterPropertiesSet方法");}@Overridepublicvoiddestroy()throwsException{System.out.println("8--》调用DisposableBean接口的destroy方法");}}

首先这个Bean实现了ApplicationContextAware、InitialzingBean、DisposableBean,并在每个方法中输出对应的内容,然后编写一个BeanPostProcessor:

publicclassMyBeanPostProcessorimplementsBeanPostProcessor{@OverridepublicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{System.out.println("7--》调用MyBeanPostProcessor的postProcessBeforeInitialization方法");returnBeanPostProcessor.super.postProcessAfterInitialization(bean,beanName);}@OverridepublicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{System.out.println("4--》调用MyBeanPostProcessor的postProcessAfterInitialization方法");returnBeanPostProcessor.super.postProcessBeforeInitialization(bean,beanName);}}

最后将它们注册到容器中:

@ConfigurationpublicclassMyBeanConfig{@Bean(initMethod="init",destroyMethod="myDestroy")publicUseruser(){Useruser=newUser();user.setName("zs");user.setAge(30);returnuser;}@BeanpublicBeanPostProcessorbeanPostProcessor(){returnnewMyBeanPostProcessor();}}

运行结果:

1--》创建User实例2--》设置User的name属性2--》设置User的age属性3--》调用对应Aware接口的方法4--》调用MyBeanPostProcessor的postProcessAfterInitialization方法5--》调用InitializingBean接口的afterPropertiesSet方法6--》调用init-method属性指定的方法7--》调用MyBeanPostProcessor的postProcessBeforeInitialization方法8--》调用DisposableBean接口的destroy方法9--》调用destroy-method属性指定的方法


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/319.html