概述 本方法(invokeBeanFactoryPostProcessors)
会实例化和调用所有 BeanFactoryPostProcessor
(包括其子类BeanDefinitionRegistryPostProcessor
)。
BeanFactoryPostProcessor
接口是 Spring
初始化 BeanFactory
时对外暴露的扩展点,Spring
IoC 容器允许 BeanFactoryPostProcessor
在容器实例化任何 bean
之前读取 bean
的定义,并可以修改它。
BeanDefinitionRegistryPostProcessor
继承自 BeanFactoryPostProcessor
,比 BeanFactoryPostProcessor
具有更高的优先级,主要用来在常规的 BeanFactoryPostProcessor
检测开始之前注册其他 bean
定义。特别是,你可以通过 BeanDefinitionRegistryPostProcessor
来注册一些常规的 BeanFactoryPostProcessor
,因为此时所有常规的 BeanFactoryPostProcessor
都还没开始被处理。
项目中的实战 BeanDefinitionRegistryPostProcessor
初始化Bean
的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class MultiOssScannerConfigurer implements BeanDefinitionRegistryPostProcessor , InitializingBean, ApplicationContextAware, BeanNameAware { @Setter private MultiOssProperties multiOssProperties; @Override public void postProcessBeanDefinitionRegistry (BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException { String beanSuffixName = StringUtils.capitalize(OssConstants.BEAN_SUFFIX_NAME); multiOssProperties.getClients().forEach((productCode, ossProperties) -> { AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(OssClient.class, () -> OssClientUtils.buildOssClient(ossProperties)) .getRawBeanDefinition(); beanDefinition.setInitMethodName("init" ); beanDefinition.setDestroyMethodName("shutDown" ); beanDefinitionRegistry.registerBeanDefinition(productCode + beanSuffixName, beanDefinition); }); } }
BeanFactoryPostProcessor初始化的时候do something
1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class KeplerBeanFactoryPostInitializer implements BeanFactoryPostProcessor { @Override public void postProcessBeanFactory (ConfigurableListableBeanFactory beanFactory) throws BeansException { Map<String, AviatorFunction> aviatorFunctionMap = beanFactory.getBeansOfType(AviatorFunction.class); if (aviatorFunctionMap.size() > 0 ) { log.info("初始化自定义RuleLoader..." ); aviatorFunctionMap.forEach((k, v) -> { log.info("加载Rule:{}" , k); AviatorEvaluator.addFunction(v); }); } RuleLoader.initRule(); } }
跟进源代码 1 2 3 4 5 6 7 8 9 10 protected void invokeBeanFactoryPostProcessors (ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor (beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader (beanFactory.getBeanClassLoader())); } }
getBeanFactoryPostProcessors 1 2 3 4 5 6 7 public List<BeanFactoryPostProcessor> getBeanFactoryPostProcessors () { return this .beanFactoryPostProcessors; }
这边 getBeanFactoryPostProcessors()
会拿到当前应用上下文中已经注册的 BeanFactoryPostProcessor
,在默认情况下,this.beanFactoryPostProcessors
是返回空的。
1 2 3 4 5 6 7 8 public interface ApplicationContextInitializer <C extends ConfigurableApplicationContext > { void initialize (C applicationContext) ; }
invokeBeanFactoryPostProcessors 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 public static void invokeBeanFactoryPostProcessors ( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { Set<String> processedBeans = new HashSet <String>(); if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List<BeanFactoryPostProcessor> regularPostProcessors = new LinkedList <BeanFactoryPostProcessor>(); List<BeanDefinitionRegistryPostProcessor> registryProcessors = new LinkedList <BeanDefinitionRegistryPostProcessor>(); for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; registryProcessor.postProcessBeanDefinitionRegistry(registry); registryProcessors.add(registryProcessor); } else { regularPostProcessors.add(postProcessor); } } List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList <BeanDefinitionRegistryPostProcessor>(); String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true , false ); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true , false ); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); boolean reiterate = true ; while (reiterate) { reiterate = false ; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true , false ); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true ; } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); } invokeBeanFactoryPostProcessors(registryProcessors, beanFactory); invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory); } else { invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory); } String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true , false ); List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList <BeanFactoryPostProcessor>(); List<String> orderedPostProcessorNames = new ArrayList <String>(); List<String> nonOrderedPostProcessorNames = new ArrayList <String>(); for (String ppName : postProcessorNames) { if (processedBeans.contains(ppName)) { } else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class)); } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } sortPostProcessors(priorityOrderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList <BeanFactoryPostProcessor>(); for (String postProcessorName : orderedPostProcessorNames) { orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } sortPostProcessors(orderedPostProcessors, beanFactory); invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory); List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList <BeanFactoryPostProcessor>(); for (String postProcessorName : nonOrderedPostProcessorNames) { nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class)); } invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory); beanFactory.clearMetadataCache(); }
sortPostProcessors 1 2 3 4 5 6 7 8 9 10 11 12 13 private static void sortPostProcessors (List<?> postProcessors, ConfigurableListableBeanFactory beanFactory) { Comparator<Object> comparatorToUse = null ; if (beanFactory instanceof DefaultListableBeanFactory) { comparatorToUse = ((DefaultListableBeanFactory) beanFactory).getDependencyComparator(); } if (comparatorToUse == null ) { comparatorToUse = OrderComparator.INSTANCE; } Collections.sort(postProcessors, comparatorToUse); }
默认情况下,比较器为 OrderComparator
;如果配置了 annotation-config
,并且值为true
,使用的是 AnnotationAwareOrderComparator
,AnnotationAwareOrderComparator
继承自 OrderComparator
,只是重写了部分方法,比较器的部分代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 @Override public int compare (Object o1, Object o2) { return doCompare(o1, o2, null ); } private int doCompare (Object o1, Object o2, OrderSourceProvider sourceProvider) { boolean p1 = (o1 instanceof PriorityOrdered); boolean p2 = (o2 instanceof PriorityOrdered); if (p1 && !p2) { return -1 ; } else if (p2 && !p1) { return 1 ; } int i1 = getOrder(o1, sourceProvider); int i2 = getOrder(o2, sourceProvider); return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0 ; }
总结 第一点:整个 invokeBeanFactoryPostProcessors
方法围绕两个接口,BeanDefinitionRegistryPostProcessor
和 BeanFactoryPostProcessor
,其中 BeanDefinitionRegistryPostProcessor
继承了 BeanFactoryPostProcessor
。BeanDefinitionRegistryPostProcessor
主要用来在常规 BeanFactoryPostProcessor
检测开始之前注册其他 Bean 定义,说的简单点,就是 BeanDefinitionRegistryPostProcessor
具有更高的优先级,执行顺序在 BeanFactoryPostProcessor
之前。
第二点:整个 invokeBeanFactoryPostProcessors
方法操作了 3 种 bean 对象:
入参 beanFactoryPostProcessors
:拿的是 AbstractApplicationContext
类的 beanFactoryPostProcessors
属性值,也就是在之前已经添加到 beanFactoryPostProcessors
中的 BeanFactoryPostProcessor
BeanDefinitionRegistryPostProcessor
接口实现类:实现了 BeanDefinitionRegistryPostProcessor
接口,并且注册到 Spring IoC
容器中。
常规 BeanFactoryPostProcessor
接口实现类:实现了 BeanFactoryPostProcessor
接口,并且注册到 Spring IoC
容器中。
第三点:操作3种 bean 对象具体指的是调用它们重写的方法,调用实现方法时会遵循以下的优先级: 两个用于排序的重要接口:PriorityOrdered
和 Ordered
,其中 PriorityOrdered
继承了 Ordered
,并且 PriorityOrdered
的优先级要高于 Ordered
,这跟 BeanDefinitionRegistryPostProcessor
继承 BeanFactoryPostProcessor
有点类似。实现 Ordered
接口需要重写 getOrder
方法,返回一个用于排序的 order
值,order
值的范围为 Integer.MIN_VALUE ~ Integer.MAX_VALUE
,order
值越小优先级越高,Integer.MIN_VALUE
拥有最高优先级,而 Integer.MAX_VALUE
则对应的拥有最低优先级。
第四点:常见的 Java EE
相关的框架或者中间件,经常使用 BeanFactoryPostProcessor
来进行扩展,例如上面的 Mybatis
,因此了解 BeanFactoryPostProcessor
的原理会对之后理解其他中间件的原理有帮助。
参考地址