这个也是一个很经常在工程中看到的接口实现,从字面上 BeanPostProcessor 的意思就是 Bean 的后置处理器。主要作用就是帮助我们在bean实例化之后,初始化前后做一些事情。
spring 会自动从它的所有的 bean 定义中检测 BeanPostProcessor 类型的bean 定义,然后实例化它们,再将它们应用于随后创建的每一个bean实例。
在 bean 实例的初始化方法回调之前调用 BeanPostProcessor 的postProcessBeforeInitialization 的方法(进行 bean 实例属性的填充)。
在 bean 实例的初始化方法回调之后调用 BeanPostProcessor 的postProcessAfterInitialization 的方法(可以进行 bean 实例的代理封装)。
现在让我们来简单的写个demo:
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
public MyBeanPostProcessor () {
System.out.println("MyBeanPostProcessor 实例化......");
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("spring中bean实例:" + beanName + " 初始化之前处理......");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("spring中bean实例:" + beanName + " 初始化之后处理......");
return bean;
}
}
如果我们想在Spring容器中完成bean实例化、配置以及其他初始化方法前后要添加一些自己逻辑处理。我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中。
Spring中Bean的实例化过程图示:
以及还有各个注意事项:
- 接口中的两个方法都要将传入的bean返回,而不能返回null,如果返回的是null那么我们通过getBean方法将得不到目标。
- BeanFactory和ApplicationContext对待bean后置处理器稍有不同。ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean,并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它,因此部署一个后置处理器同部署其他的bean并没有什么区别。而使用BeanFactory实现的时候,bean 后置处理器必须通过代码显式地去注册,在IoC容器继承体系中的ConfigurableBeanFactory接口中定义了注册方法
- 另外,不要将BeanPostProcessor标记为延迟初始化。因为如果这样做,Spring容器将不会注册它们,自定义逻辑也就无法得到应用。假如你在元素的定义中使用了’default-lazy-init’属性,请确信你的各个BeanPostProcessor标记为’lazy-init=“false”’。