什么是Bean的生命周期呢?


Bean的生命周期指Bean创建-->初始化-->销毁 的过程
我们可以自定义Bean初始化和销毁方法
容器在bean进行到当前生命周期的时候, 来调用自定义的初始化和销毁方法



早期xml的方式,在<bean>标签里 需要写 init-method destroy-method,指定初始化的方法要做的事以及销毁的时候要做的事,如下图所示:



springboot bean什么时候销毁 spring bean销毁时间_spring生命周期



后来可以直接用注解的方式:

单实例Bean的生命周期:


单例Bean的生命周期就是 
ioc容器创建的时候,会调用单例bean的构造器以及init方法初始化bean;
ioc容器关闭的时候,调用destory销毁bean。


springboot bean什么时候销毁 spring bean销毁时间_初始化_02


测试:


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_03


如上图所示,单例Bean的生命周期就是 ioc容器创建的时候,会调用单例bean的构造器以及init方法初始化bean;ioc容器关闭的时候,调用destory销毁bean。


多实例Bean的生命周期:


对于多实例的bean,容器只负责初始化, 但不会管理bean, 容器关闭时不会调用销毁方法


可以添加 @Scope("prototype") 来验证


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_04


测试:可以看到Sandy类里写的任何输出都没有


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_05



上述方法都是自己在实体类里写 init() 和 destory()方法。

Spring也有相应的提供Bean的 init() 和 destory() 接口:

init:实现 InitializingBean 接口的 afterPropertiesSet() 方法,当 beanFactory 创建好对象,且把bean所有属性设置好之后,会调这个方法,相当于初始化方法

destory:实现 DisposableBean的destory()方法,当bean销毁时,会把单实例bean进行销毁


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_06


测试类:


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_07



还有一种方式,使用注解:


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_08


springboot bean什么时候销毁 spring bean销毁时间_初始化_09


测试:


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_10



看下面这段代码:是Bean的生命周期的一段核心代码,具体打个断点就可以找到


springboot bean什么时候销毁 spring bean销毁时间_初始化_11


Bean生命周期 BeanPostProcessor

在bean初始化之前调用进行拦截,在bean初始化前后进行一些处理工作

使用BeanPostProcessor如何控制Bean的生命周期;

实现BeanPostProcessor的两个接口即可

1, postProcessBeforeInitialization()

2,postProcessAfterInitialization()

实体类SuSan:用注解@PostConstruct标注了 init ,用@PreDestroy 标注了destory 方法


springboot bean什么时候销毁 spring bean销毁时间_初始化_12


空的实体类:和有初始化和销毁方法的SuSan类做对比


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_13


实现了 BeanPostProcessor 接口的类 T


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_14


然后是配置类:


springboot bean什么时候销毁 spring bean销毁时间_初始化_15


因为我在实体类上标注了 @Component , 在配置类上又标注了@ComponentScan

这样配置类就可以把相应路径下的包里加了 @Component、@Service、@Controller等注解的类自动注入到容器中,所以在配置类里就不用再写对应实体类写方法 然后方法头上加@Bean了。

测试类:


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_16


springboot bean什么时候销毁 spring bean销毁时间_spring生命周期_17



BeanPostProcessor 具体后面文章再做分析