Spring与bean有关的生命周期示例详解
前言
记得以前的时候,每次提起Spring中的bean相关的生命周期时,内心都无比的恐惧,因为好像有很多,自己又理不清楚:什么beanFactory啊,aware接口啊,beanPostProcessor啊,afterPropertiesSet啊,initMethod啊等等。
今天终于理清这些关系了,并且又新增了对postConstruct和lifecycle的理解。
执行顺序
-首先是BeanFactoryPostProcessor,它是针对所有bean的definition的,只执行一次
下面是针对每个bean的初始
- -实现了一系列aware接口的,比如BeanNameAware,ApplicationContextAware,调用其set方法
- -执行BeanPostProcessor的postProcessBeforeInitialization方法
- -带有@PostConstruct注解的方法
- -实现InitializingBean接口的afterPropertiesSet方法
- -指定的initMethod方法
- -执行BeanPostProcessor的postProcessAfterInitialization方法
- -实现了SmartLifecycle接口的start方法(实现Lifecycle接口的不会自动调用,需要显式的调用start方法)
下面是针对每个bean的销毁
- -实现了SmartLifecycle接口的stop方法(实现Lifecycle接口的不会自动调用,需要显式的调用stop方法)
- -带有@PreDestroy注解的方法
- -实现DisposableBean接口的destroy方法
- -指定的destroyMethod方法
目前就想到这么多了,其他的麻烦在评论区留言呀~
代码实例
bean实体类
/** *@date:2020-07-22 * *一个简单的枚举类 */ publicenumBeanType{ NORMAL,LIFECYCLE,SMART_LIFECYCLE; } importjavax.annotation.PostConstruct; importjavax.annotation.PreDestroy; importlombok.extern.slf4j.Slf4j; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.BeanNameAware; importorg.springframework.beans.factory.DisposableBean; importorg.springframework.beans.factory.InitializingBean; importorg.springframework.context.ApplicationContext; importorg.springframework.context.ApplicationContextAware; /** *@author:lihui *@date:2020-07-22 *一个简单的bean */ @Slf4j publicclassNormalBeanimplementsBeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{ privateBeanTypebeanType; publicNormalBean(){ this(BeanType.NORMAL); } publicNormalBean(BeanTypebeanType){ this.beanType=beanType; } @PostConstruct publicvoidpostConstruct(){ log.info("{},postConstruct",beanType); } @Override publicvoidafterPropertiesSet()throwsException{ log.info("{},afterPropertiesSet",beanType); } publicvoidinitMethod(){ log.info("{},initMethod",beanType); } @PreDestroy publicvoidpreDestroy(){ log.info("{},preDestroy",beanType); } @Override publicvoiddestroy()throwsException{ log.info("{},destroy",beanType); } publicvoiddestroyMethod(){ log.info("{},destroyMethod",beanType); } @Override publicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{ log.info("setApplicationContext,applicationContext:{}",applicationContext); } @Override publicvoidsetBeanName(Stringname){ log.info("setBeanName,beanname:{}",name); } } importlombok.extern.slf4j.Slf4j; importorg.springframework.context.Lifecycle; /** *@author:lihui *@date:2020-07-22 *实现了Lifecycle的一个bean */ @Slf4j publicclassLifecycleBeanextendsNormalBeanimplementsLifecycle{ privatevolatilebooleanrunning=false; publicLifecycleBean(){ super(BeanType.LIFECYCLE); } @Override publicvoidstart(){ log.info("start"); running=true; } @Override publicvoidstop(){ log.info("stop"); running=false; } @Override publicbooleanisRunning(){ returnrunning; } } importlombok.extern.slf4j.Slf4j; importorg.springframework.context.SmartLifecycle; /** *@author:lihui *@date:2020-07-22 *实现了SmartLifecycle的一个bean */ @Slf4j publicclassSmartLifecycleBeanextendsNormalBeanimplementsSmartLifecycle{ privatevolatilebooleanrunning=false; publicSmartLifecycleBean(){ super(BeanType.SMART_LIFECYCLE); } @Override publicvoidstart(){ log.info("start"); running=true; } @Override publicvoidstop(){ log.info("stop"); running=false; } @Override publicbooleanisRunning(){ returnrunning; } }
配置类
importlombok.extern.slf4j.Slf4j; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.config.BeanFactoryPostProcessor; importorg.springframework.beans.factory.config.ConfigurableListableBeanFactory; /** *@author:lihui *@date:2020-07-25 */ @Slf4j publicclassMyBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{ @Override publicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{ log.info("postProcessBeanFactory,beanFactory:{}",beanFactory); } } importlombok.extern.slf4j.Slf4j; importorg.springframework.beans.BeansException; importorg.springframework.beans.factory.config.BeanPostProcessor; /** *@author:lihui *@date:2020-07-25 */ @Slf4j publicclassMyBeanPostProcessorimplementsBeanPostProcessor{ @Override publicObjectpostProcessBeforeInitialization(Objectbean,StringbeanName)throwsBeansException{ log.info("postProcessBeforeInitialization,bean:{}",beanName); returnbean; } @Override publicObjectpostProcessAfterInitialization(Objectbean,StringbeanName)throwsBeansException{ log.info("postProcessAfterInitialization,bean:{}",beanName); returnbean; } } importlombok.extern.slf4j.Slf4j; importorg.springframework.context.SmartLifecycle; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; /** *@author:lihui *@date:2020-07-22 */ @Configuration @Slf4j publicclassConfig{ @Bean(initMethod="initMethod",destroyMethod="destroyMethod") publicNormalBeannormalBean(){ returnnewNormalBean(); } @Bean(initMethod="initMethod",destroyMethod="destroyMethod") publicLifecycleBeanlifecycleBean(){ returnnewLifecycleBean(); } @Bean(initMethod="initMethod",destroyMethod="destroyMethod") publicSmartLifecyclesmartLifecycle(){ returnnewSmartLifecycleBean(); } @Bean publicstaticMyBeanFactoryPostProcessormyBeanFactoryPostProcessor(){ returnnewMyBeanFactoryPostProcessor(); } @Bean publicstaticMyBeanPostProcessormyBeanPostProcessor(){ returnnewMyBeanPostProcessor(); } }
Main类
importlombok.extern.slf4j.Slf4j; importorg.springframework.context.ConfigurableApplicationContext; importorg.springframework.context.annotation.AnnotationConfigApplicationContext; /** *@author:lihui *@date:2020-07-22 */ @Slf4j publicclassMain{ publicstaticvoidmain(String[]args)throwsInterruptedException{ ConfigurableApplicationContextctx=newAnnotationConfigApplicationContext(Config.class); ctx.registerShutdownHook(); Thread.sleep(5000); log.info("line-----------------------------line"); ctx.start(); ctx.stop(); log.info("line-----------------------------line"); } }
结果说明
结果正如前面所说的执行顺序一致,主要注意的就是Lifecycle接口和SmartLifecycle接口,只有实现了SmartLifecycle接口的bean在初始化时才会被自动调用,而实现了Lifecycle接口的除非显式调用start和stop方法才会被调用。
总结
到此这篇关于Spring与bean有关的生命周期的文章就介绍到这了,更多相关Spring与bean生命周期内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!