网站曝光率,哈尔滨网络公司新闻,什么网站做玩具的外贸,wordpress 删除超文本简介
在Bean的创建过程中会有很多的后置处理器#xff0c;例如实例化前、实例化后、初始化前、初始化后#xff0c;属性填充等#xff0c;这些都是通过BeanPostProcessor来实现的
那么既然每个Bean都有有这些生命周期#xff0c;这些BeanPostProcessor肯定需要提前知道例如实例化前、实例化后、初始化前、初始化后属性填充等这些都是通过BeanPostProcessor来实现的
那么既然每个Bean都有有这些生命周期这些BeanPostProcessor肯定需要提前知道并且实例化出来保存而我们前面介绍来BeanDefinition的扫描就可以把所有的Bean找出来只要在实例化单例Bean之前把BeanPostProcessor实例化好就行了
在spring中就有这么一步注册BeanPostProcessor 就在AbstractApplicationContext#refresh方法中的一步registerBeanPostProcessors(beanFactory);
源码解析
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {// 通过getBeanNamesForType可以拿到所有的名字因为这个时候还没有实例化所以就拿到名字里面使用isTypeMatch匹配String[] postProcessorNames beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);ListBeanPostProcessor priorityOrderedPostProcessors new ArrayList(); // 找出所有实现 PriorityOrdered的BeanPostProcessorListBeanPostProcessor internalPostProcessors new ArrayList(); // 内置的BeanPostProcessor 如 MergedBeanDefinitionPostProcessorListString orderedPostProcessorNames new ArrayList(); // 找出所有实现 Ordered的BeanPostProcessorListString nonOrderedPostProcessorNames new ArrayList(); // 没有任何排序的BeanPostProcessorfor (String ppName : postProcessorNames) {if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {// 通过getBean获得BeanPostProcessor对象BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class);priorityOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}}sortPostProcessors(priorityOrderedPostProcessors, beanFactory); // 升序排序registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); // 注册BeanPostProcessorsListBeanPostProcessor orderedPostProcessors new ArrayList(orderedPostProcessorNames.size());for (String ppName : orderedPostProcessorNames) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class); // 通过getBean获得BeanPostProcessor对象orderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}sortPostProcessors(orderedPostProcessors, beanFactory); // 升序排序registerBeanPostProcessors(beanFactory, orderedPostProcessors); // 注册BeanPostProcessorsListBeanPostProcessor nonOrderedPostProcessors new ArrayList(nonOrderedPostProcessorNames.size());for (String ppName : nonOrderedPostProcessorNames) {BeanPostProcessor pp beanFactory.getBean(ppName, BeanPostProcessor.class); // 通过getBean获得BeanPostProcessor对象nonOrderedPostProcessors.add(pp);if (pp instanceof MergedBeanDefinitionPostProcessor) {internalPostProcessors.add(pp);}}registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);sortPostProcessors(internalPostProcessors, beanFactory); // 升序排序 MergedBeanDefinitionPostProcessor排在最后registerBeanPostProcessors(beanFactory, internalPostProcessors);beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); //注册 ApplicationListenerDetector 这个后续将
}注册也会有个先后顺序首先是实现了PriorityOrdered的排在前面然后是实现Ordered接口的再然后是没有现实排序接口的最后是内置的例如MergedBeanDefinitionPostProcessor
这些BeanPostProcessor都会注册通过beanFactory缓存起来
private final ListBeanPostProcessor beanPostProcessors new BeanPostProcessorCacheAwareList();public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {Assert.notNull(beanPostProcessor, BeanPostProcessor must not be null);this.beanPostProcessors.remove(beanPostProcessor);this.beanPostProcessors.add(beanPostProcessor);
}总结
从上面的代码中可以看出在其他的单例Bean实例化之前会先把BeanPostProcessor实例化好并且排序
后面讲实例化前的BeanPostProcessor 欢迎关注学习不迷路