1、生命周期介绍
Java Bean的生命周期指的是:Bean的创建、初始化、销毁
Spring为我们提供了多种方式介入Bean的生命周期,即在生命周期中加入额外的自定义逻辑。
- Bean的创建:指的是Spring通过构造方法,实例化Bean的过程。
- 属性赋值。之后才是Bean的初始化过程,Bean的初始化过程可以由用户直接介入,指定Bean的初始化逻辑,怎么介入下面会介绍。
- Bean的销毁:Bean的销毁指的是Spring容器销毁之前,Spring会执行的Bean中的销毁方法,销毁过程也可以由用户直接介入,指定Bean的销毁逻辑,怎么介入下面会介绍。
2、Bean的初始化
2.1 初始化逻辑介入
所谓的初始化逻辑介入指的是,由用户代码指定Bean的初始化逻辑,默认情况下,没有指定初始化方法的情况下,就什么也不做。可以通过如下几种方式设置自定义的Bean初始化逻辑:
- @Bean注解,@Bean注解中的
initMethod
属性用于指定Bean中的初始化方法。 - JSR250规范中的
@PostConstruct
注解,将该注解标注在Bean的某个方法上,该方法就为Bean的初始化方法。 - 实现
InitializingBean
接口,该接口的方法就是Bean的初始化方法。
2.2 初始化前后逻辑介入
2.1 中说明了如何指定Bean的初始化方法,有的时候,我们需要在Bean初始化之前或者Bean初始化之后主动介入完成某些额外的功能,此时就需要借助BeanPostProcessor
接口。
BeanPostProcessor接口中有两组方法,分别是:
postProcessBeforeInitialization
,该方法会在Bean的初始化方法执行之前执行,该方法会返回一个Object类型的对象,返回的对象要么是原对象,要么是对原对象的包装对象,即增强,比如动态代理后的对象。@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; }
postProcessAfterInitialization
,该方法会在Bean的初始化方法执行后执行,该方法也会返回一个Object类型的对象,返回的对象要么是原对象,要么是对原对象的包装对象,即增强,比如动态代理后的对象。@Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; }
3、Bean的销毁
Spring容器在停止前会主动调用Bean的销毁方法(如果有的话),因此可以借助销毁方法完成某些资源的释放等。Bean的销毁方法也可以完全由用户介入,介入的方法有如下几种:
- @Bean注解,@Bean注解中的
destroyMethod
属性用于指定Bean中的哪个方法为Bean的销毁方法。 - JSR250规范中定义的
@PreDestroy
注解,该注解用于标注Bean的方法,被标注的方法为Bean的销毁方法。 - 实现
DisposableBean
接口,该接口中的方法会在Bean销毁前被调用执行。