上一篇中简单介绍了Spring中invokeBeanFactoryPostProcessors方法的执行流程,以及BFPP和BDRPP类的介绍,这篇文章我们来自定义实现一个类的后置处理器。
自定义PostProcessor
自定义PostProcessor的方式一共两种,都是根据invokeBeanFactoryPostProcessors()方法中的参数来实现的,其中一种是加到beanFactory,另一种是添加到参数List< BeanFactoryPostProcessor > 中。两种方法的实现相差不大。这篇文章会讲解添加到参数 List 中的方式。
还记得源码中会根据BDRPP类型多次获取PostProcessorNames么?我们在自定义实现的过程中,就会还原在执行postProcessBeanDefinitionRegistry() 方法时,创建BDRPP类,RegistryCustomerBDRPP 类就是要添加的。
public class RegistryCustomerBDRPP implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanDefinitionRegistry方法");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanFactory方法");
}
@Override
public int getOrder() {
return 0;
}
}
通过MyCustomerBeanDefinitionRegistryPostProcessor类中ppbdr方法的执行,创建RegistryCustomerBDRPP。
public class MyCustomerBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
BeanDefinitionBuilder customer = BeanDefinitionBuilder.rootBeanDefinition(RegistryCustomerBDRPP.class);
System.out.println("在BDRPP中注册新的 BDRPP");
registry.registerBeanDefinition("customer",customer.getBeanDefinition());
System.out.println("自定义BDRPP------------调用方法MyCustomerBeanDefinitionRegistryPostProcessor");
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("Customer -----------实现BDRPP中postProcessBeanFactory方法");
}
@Override
public int getOrder() {
return 0;
}
}
类已经创建完成,接下来就是如何添加到参数 List< BeanFactoryPostProcessor >中,看源码不难发现,获取List< BeanFactoryPostProcessor >时,是通过getBeanFactoryPostProcessors()方法来获取的。关于具体源码执行逻辑可看上一篇Sping源码(七)— 后置处理器有详细讲解。
源码部分
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
//省略无用代码
}
}
//具体调用方法
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
//省略无用代码
}
在Spring源码中,有get方法,那一定会有对应的add()或set()方法进行值的填充。
通过点击可发现getBeanFactoryPostProcessors()方法是在AbstractApplicationContext中实现的,AbstractApplicationContext类关系图如下,可以看到,子类中有ClassPathXmlApplicationContext,所以,我们可以通过实现ClassPathXmlApplicationContext类重写addBeanFactoryPostProcessor()的方式将我们自定义的PostProcessor添加进去。
AbstractApplicationContext
public abstract class AbstractApplicationContext extends DefaultResourceLoader
implements ConfigurableApplicationContext {
public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {
return this.beanFactoryPostProcessors;
}
@Override
public void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor) {
this.beanFactoryPostProcessors.add(postProcessor);
}
}
addBeanFactoryPostProcessor
通过这种方式,在invokeBeanFactoryPostProcessors方法执行时,就会在getBeanFactoryPostProcessors()方法中获取到我们添加的BDRPP。
public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
@Override
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
super.addBeanFactoryPostProcessor(new MyCustomerBeanDefinitionRegistryPostProcessor());
}
}
而如果想要将自定义BDRPP添加到BeanFactory中就更简单了,自定义好BDRPP后,通过< bean >标签能够让Spring识别到你的BDRPP即可。在执行invokeBeanFactoryPostProcessors时,就会在BeanFactory中直接获取到。