上一篇中简单介绍了Spring中invokeBeanFactoryPostProcessors方法的执行流程,以及BFPP和BDRPP类的介绍,这篇文章我们来自定义实现一个类的后置处理器。
自定义PostProcessor
自定义PostProcessor的方式一共两种,都是根据invokeBeanFactoryPostProcessors()方法中的参数来实现的,其中一种是加到beanFactory,另一种是添加到参数List< BeanFactoryPostProcessor > 中。两种方法的实现相差不大。这篇文章会讲解添加到参数 List 中的方式。
还记得源码中会根据BDRPP类型多次获取PostProcessorNames么?我们在自定义实现的过程中,就会还原在执行postProcessBeanDefinitionRegistry() 方法时,创建BDRPP类,RegistryCustomerBDRPP 类就是要添加的。
public class RegistryCustomerBDRPP implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanDefinitionRegistry方法");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("执行自定义RegistryCustomerBDRPP ,调用postProcessBeanFactory方法");}@Overridepublic int getOrder() {return 0;}
}
通过MyCustomerBeanDefinitionRegistryPostProcessor类中ppbdr方法的执行,创建RegistryCustomerBDRPP。
public class MyCustomerBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {@Overridepublic 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");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {System.out.println("Customer -----------实现BDRPP中postProcessBeanFactory方法");}@Overridepublic 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 DefaultResourceLoaderimplements ConfigurableApplicationContext {public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors() {return this.beanFactoryPostProcessors;}@Overridepublic void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor) {this.beanFactoryPostProcessors.add(postProcessor);}
}
类关系图
addBeanFactoryPostProcessor
通过这种方式,在invokeBeanFactoryPostProcessors方法执行时,就会在getBeanFactoryPostProcessors()方法中获取到我们添加的BDRPP。
public class MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {@Overrideprotected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {super.addBeanFactoryPostProcessor(new MyCustomerBeanDefinitionRegistryPostProcessor());}
}
而如果想要将自定义BDRPP添加到BeanFactory中就更简单了,自定义好BDRPP后,通过< bean >标签能够让Spring识别到你的BDRPP即可。在执行invokeBeanFactoryPostProcessors时,就会在BeanFactory中直接获取到。