通过实现接口BeanPostProcessor的postProcessAfterInitialization方法,应用于bean加载过程中
执行顺序:
- postProcessBeforeInitialization---->实现接口BeanPostProcessor,初始化前执行、@PostConstruct注解的方法(构造方法执行后执行)
- afterPropertiesSet:实现InitializingBean接口
- 执行自定义初始化方法:initMethod(bean标签中存在init-method属性)
- postProcessAfterInitialization---->实现接口BeanPostProcessor,初始化后执行
- 调用被@PreDestroy注解的方法:销毁方法执行前执行
- destroy:实现DisposableBean接口
- 执行自定义销毁方法:destroyMethod(bean标签中存在destroy-method属性)
扩展应用
- AbstractAutoProxyCreator之postProcessBeforeInstantiation:是继承了BeanPostProcessor的InstantiationAwareBeanPostProcessor的默认方法,创建代理对象
- InstantiationAwareBeanPostProcessor:实例化前后执行
- SmartInstantiationAwareBeanPostProcessor:继承InstantiationAwareBeanPostProcessor,用于提前推断
代码展示:
public class Cat implements DisposableBean, InitializingBean {
public Cat() {
System.out.println("Cat类的构造方法...");
}
@PostConstruct
public void postConstruct() {
System.out.println("Cat的postConstruct()方法...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Cat的afterPropertiesSet()方法...");
}
public void initMethod() {
System.out.println("Cat的自定义initMethod()方法...");
}
@PreDestroy
public void preDestroy() {
System.out.println("Cat的preDestroy()方法...");
}
/**
* 销毁方法
*/
@Override
public void destroy() throws Exception {
System.out.println("Cat的destroy()方法...");
}
/**
* 自定义销毁方法
*/
public void destroyMethod() {
System.out.println("Cat的自定义destroyMethod()方法...");
}
}
@Configuration
public class TestConfig {
@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
public Cat cat() {
return new Cat();
}
}
@Test
public void testBeanLifeCircle() {
//创建IOC容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TestConfig.class);
//关闭IOC容器
context.close();
}
执行结果:
Cat类的构造方法...
Cat的postConstruct()方法...
Cat的afterPropertiesSet()方法...
Cat的自定义initMethod()方法...
......
Cat的preDestroy()方法...
Cat的destroy()方法...
Cat的自定义destroyMethod()方法...