Spring中bean的生命周期主要四个阶段:
- 实例化
- 属性赋值
- 初始化
- 销毁
实例化之前
继承org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter.postProcessBeforeInstantiation
一、实例化
单实例:在容器启动的时候创建对象
多实例:在每次获取的时候创建对象
实例化之后
继承org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter.postProcessAfterInstantiation
二、属性赋值
初始化前
实现org.springframework.beans.factory.config.BeanPostProcessor.postProcessBeforeInitialization
三、初始化
对象创建完成,并且赋值完成,调用初始化方法,指定初始化方法有如下几种方式
- 使用@Bean注解中的initMethod方法,等同于xml中bean标签的init-method属性
- 通过bean实现InitializingBean接口
- 使用JSR250(java规范)@PostConstruct注解,bean创建完成并且完成属性赋值,来执行初始化方法
初始化后
实现org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization
四、销毁
- 使用@Bean注解中的destroyMethod方法,等同于xml中bean标签的destroy-method属性
- 通过bean实现DisposableBean接口
- 使用JSR250(java规范)@PreDestroy注解,在容器移除bean之前.
注意:
单实例:容器关闭的会执行
多实例:容器关闭不会调用销毁方法
五、示例:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class CatLifeBean implements InitializingBean, DisposableBean {
private String name;
public CatLifeBean(){
System.out.println("CatLifeBean 创建...");
}
public String getName() {
return name;
}
public void setName(String name) {
System.out.println("CatLifeBean setName...");
this.name = name;
}
public void init(){
System.out.println("CatLifeBean @Bean init...");
}
@PostConstruct
public void init_A(){
System.out.println("CatLifeBean @PostConstruct...");
}
public void destroy_A(){
System.out.println("CatLifeBean @Bean destroy...");
}
@PreDestroy
public void destroy_B(){
System.out.println("CatLifeBean @PreDestroy...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("CatLifeBean InitializingBean afterPropertiesSet...");
}
@Override
public void destroy() throws Exception {
System.out.println("CatLifeBean DisposableBean destroy...");
}
}
import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.stereotype.Component;
@Component
public class MyInstantiationAwareBeanPostProcessorAdapter extends InstantiationAwareBeanPostProcessorAdapter {
@Override
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
System.out.println(beanName+"在实例化之前...");
return super.postProcessBeforeInstantiation(beanClass,beanName);
}
@Override
public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
System.out.println(beanName+"在实例化之后...");
return super.postProcessAfterInstantiation(bean,beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
System.out.println(beanName+"属性赋值中...");
return super.postProcessProperties(pvs,bean,beanName);
}
}
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor beanName " + beanName + "bean-->" + "postProcessBeforeInitialization ...");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("BeanPostProcessor beanName " + beanName + "bean-->" + "postProcessAfterInitialization ...");
return bean;
}
}
import com.model.CatLifeBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(value = "com.model")
public class CatLifeConfig {
@Bean(initMethod = "init",destroyMethod = "destroy_A")
public CatLifeBean catLifeBean(){
CatLifeBean catLifeBean = new CatLifeBean();
catLifeBean.setName("张三");
return catLifeBean;
}
}
测试结果:
10:51:54.433 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'catLifeBean'
catLifeBean在实例化之前...
CatLifeBean 创建...
CatLifeBean setName...
catLifeBean在实例化之后...
catLifeBean属性赋值中...
BeanPostProcessor beanName catLifeBeanbean-->postProcessBeforeInitialization ...
CatLifeBean @PostConstruct...
CatLifeBean InitializingBean afterPropertiesSet...
CatLifeBean @Bean init...
BeanPostProcessor beanName catLifeBeanbean-->postProcessAfterInitialization ...
10:51:54.491 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6e8dacdf, started on Mon Aug 15 10:51:54 CST 2022
CatLifeBean @PreDestroy...
CatLifeBean DisposableBean destroy...
CatLifeBean @Bean destroy...
六、Spring底层对BeanPostProcessor的使用
- 注解@Async,通过org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor处理异步方法
- org.springframework.validation.beanvalidation.MethodValidationPostProcessor
- 注入IOC容器,bean实现ApplicationContextAware、EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware接口,通过org.springframework.context.support.ApplicationContextAwareProcessor实现
- 数据校验,通过org.springframework.validation.beanvalidation.BeanValidationPostProcessor实现
- 处理@PostConstruct和@PreDestroy注解,通过org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor实现
- 注解@Autowired,通过org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor实现
- 注入其他组件,等等.