前提概要
Spring 具有很好的扩展性,但是这个扩展它的这个扩展性体现在哪里呢?而我们要说的 BeanPostProcessor 就是对 Spring 扩展性优秀的表现之一。
🍃 BeanPostProcessor 的作用
-
简单的说就是 BeanPostProcessor 提供了初始化前后回调的方法,我们所说的扩展就是在实例化前后对 Bean 进行扩展。
-
BeanDefinition 注册完成之后进行注册,在创建 Bean 过程中的实例化前后分别调用其中定义的方法;
其操作对象为:已经实例化且进行了属性填充,待初始化的 Bean 实例。
🍃 源码分析
public interface BeanPostProcessor {
/**
* 初始前调用
*/
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
/**
* 初始化后调用
*/
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
}
-
上面就是 BeanPostProcessor 接口的定义,从方法名字也能看出这两个方法一个在初始化前调用一个在初始化后调用。
-
注意的是,方法的返回值为原始实例或者包装后的实例。如果返回 null 会导致后续的 BeanPostProcessor 不生效(BeanPostProcessor 是可以注册多个的)。
🍃 如何使用
BeanPostProcessorDemo 代码如下:
public class BeanPostProcessorDemo {
public static void main(String[] args) {
//创建基础容器
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
//加载xml配置文件
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("spring-bean-post-processor.xml");
//添加BeanPostProcessor
beanFactory.addBeanPostProcessor(new UserBeanPostProcessor());
User user = beanFactory.getBean(User.class);
System.out.println(user);
}
}
@Data
class User{
private String userName;
private Integer age;
private String beforeMessage;
private String afterMessage;
public void initMethod(){
System.out.println("初始化:"+this);
this.setUserName("小明");
this.setAge(18);
}
}
class UserBeanPostProcessor implements BeanPostProcessor{
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof User){
System.out.println("初始化前:"+bean);
((User) bean).setBeforeMessage("初始化前信息");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws
BeansException {
if (bean instanceof User){
System.out.println("初始化后:"+bean);
((User) bean).setAfterMessage("初始化后信息");
}
return bean;
}
}
其他的省略......
运行之后打印结果如下:
初始化前:User(userName=null, age=null, beforeMessage=null, afterMessage=null)
初始化:User(userName=null, age=null, beforeMessage=初始化前信息, afterMessage=null)
初始化后:User(userName