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生命周期内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!