由于md文档部分hugo插件语法不兼容,建议访问作者网站查阅文章:wlizhi.cc
spring源码系列文章,示例代码的中文注释,均是 copy 自https://gitee.com/wlizhi/spring-framework 。
链接中源码是作者从 github 下载,并以自身理解对核心流程及主要节点做了详细的中文注释。
1 BeanPostProcessor的作用
BeanPostProcessor是对SpringIOC容器中bean实例化的一些扩展,在bean实例化的关键节点进行了一些插桩。
真正实例化bean的方法是beanFactory.getBean()方法。而在bean实例化之前、实例化之后、依赖注入、初始化方法执行之前、初始化方法执行之后等节点进行一些钩子回调。BeanPostProcessor的作用就体现于此。
BeanPostProcessor接口只提供初始化方法执行前、后的节点操作。其余操作在它的子接口中定义。
2 BeanPostProcessor的体系结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GEKJPSZK-1607150566302)(https://oss.wlizhi.cc/blog/spring/BeanPostProcessor-inheritance-structure.png “BeanPostProcessor及其关键子接口的方法定义-UML图”)]
上图详细注释了BeanPostProcessor及其子接口每个方法的作用节点,从BeanPostProcessor接口继承体系可以看出,BeanPostProcessor贯穿整个Spring容器中Bean的实例化流程。可以说,在Spring容器中,任何一个Bean的实例化,在其关键节点,都有BeanPostProcessor的存在。甚至可以说它是SpringIOC容器组成部分中最重要的一个类。
3 BeanPostProcessor的注册流程
以下是spring中BeanPostProcessor的源码:
finalclassPostProcessorRegistrationDelegate{publicstaticvoidregisterBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext){// 从beanDefinitionNames中获取所有BeanPostProcessor类型的beanName。
String[] postProcessorNames= beanFactory.getBeanNamesForType(BeanPostProcessor.class,true,false);// 这里之所以要+1,因为在这个方法的结尾处,单独注册了一个BeanPostProcessor:ApplicationListenerDetector// Register BeanPostProcessorChecker that logs an info message when// a bean is created during BeanPostProcessor instantiation, i.e. when// a bean is not eligible for getting processed by all BeanPostProcessors.int beanProcessorTargetCount= beanFactory.getBeanPostProcessorCount()+1+ postProcessorNames.length;
beanFactory.addBeanPostProcessor(newBeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));// Separate between BeanPostProcessors that implement PriorityOrdered,// Ordered, and the rest.// 实现了PriorityOrdered接口的。
List<BeanPostProcessor> priorityOrderedPostProcessors=newArrayList<>();// MergedBeanDefinitionPostProcessor类型的。
List<BeanPostProcessor> internalPostProcessors=newArrayList<>();// 实现了Ordered接口的。
List<String> orderedPostProcessorNames=newArrayList<>();// 没有实现排序接口的。
List<String> nonOrderedPostProcessorNames=newArrayList<>();// 对以上四种情况进行分别处理。for(String ppName: postProcessorNames){if(beanFactory.isTypeMatch(ppName, PriorityOrdered.class)){
BeanPostProcessor pp= beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);if(ppinstanceofMergedBeanDefinitionPostProcessor){
internalPostProcessors.add(pp);}}elseif(beanFactory.isTypeMatch(ppName, Ordered.class)){
orderedPostProcessorNames.add(ppName);}else{
nonOrderedPostProcessorNames.add(ppName);}}// 注册BeanPostProcessors// First, register the BeanPostProcessors that implement PriorityOrdered.sortPostProcessors(priorityOrderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);// 注册实现了Ordered接口的BeanPostProcessor。// Next, register the BeanPostProcessors that implement Ordered.
List<BeanPostProcessor> orderedPostProcessors=newArrayList<>();for(String ppName: orderedPostProcessorNames){
BeanPostProcessor pp= beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);if(ppinstanceofMergedBeanDefinitionPostProcessor){
internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, orderedPostProcessors);// 注册没有实现接口的BeanPostProcessor// Now, register all regular BeanPostProcessors.
List<BeanPostProcessor> nonOrderedPostProcessors=newArrayList<>();for(String ppName: nonOrderedPostProcessorNames){
BeanPostProcessor pp= beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);if(ppinstanceofMergedBeanDefinitionPostProcessor){
internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);// Finally, re-register all internal BeanPostProcessors.sortPostProcessors(internalPostProcessors, beanFactory);registerBeanPostProcessors(beanFactory, internalPostProcessors);// Re-register post-processor for detecting inner beans as ApplicationListeners,// moving it to the end of the processor chain (for picking up proxies etc).
beanFactory.addBeanPostProcessor(newApplicationListenerDetector(applicationContext));}}
从上面代码可以看出,BeanPostProcessor的注册流程和BeanFactoryPostProcessor的注册流程类似。获取到BeanFactory中存储的BeanPostProcessor类型的beanName,然后对实现了不同排序接口的类、及没有实现排序接口的类分别进行getBean()操作、排序和注册。
spring会在不同的流程节点执行BeanPostProcessor及其子接口对应的方法。具体的实现类在后面的spring容器bean的实例化相关文章描述。
及没有实现排序接口的类分别进行getBean()操作、排序和注册。
spring会在不同的流程节点执行BeanPostProcessor及其子接口对应的方法。具体的实现类在后面的spring容器bean的实例化相关文章描述。