简介
InstantiationAwareBeanPostProcessor又代表了Spring的另外一段生命周期:实例化。先区别一下Spring Bean的实例化和初始化两个阶段的主要作用:
实例化—-实例化的过程是一个创建Bean的过程,即调用Bean的构造函数,单例的Bean放入单例池中
初始化—-初始化的过程是一个赋值的过程,即调用Bean的setter,设置Bean的属性
之前的BeanPostProcessor作用于过程(2)前后,现在的InstantiationAwareBeanPostProcessor则作用于过程(1)前后
InstantiationAwareBeanPostProcessor接口
注意该接口继承了BeanPostProcessor接口
1 | public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { |
自定义bean
- 给前面的CommonBean加上构造函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18package com.fuyi.test.beanpostprocessor;
public class CommonBean {
public CommonBean(){
System.out.println("构造方法");
}
private String name;
public void setName(String name) {
this.name = name;
}
public void init() {
System.out.println("init method");
}
} - 定义实例化bean后处理器
1 | package com.fuyi.test.beanpostprocessor; |
配置
1 | <bean id="commonBean0" class="com.fuyi.test.beanpostprocessor.CommonBean" init-method="init"> |
启动Spring容器后,结果如下:
因为配置了2个CommonBean,所以实例化了2个该对象实例。
1 | instantiation before |
总结
Bean构造出来之前调用postProcessBeforeInstantiation()方法
Bean构造出来之后调用postProcessAfterInstantiation()方法
不过通常来讲,我们不会直接实现InstantiationAwareBeanPostProcessor接口,而是会采用继承InstantiationAwareBeanPostProcessorAdapter这个抽象类的方式来使用。