本文共 4672 字,大约阅读时间需要 15 分钟。
在之前的学习中,我们大概的学习了springBoot的初始化。大概得流程是springApplication读取通过读取spring.factories文件中SpringBootAppliationinitlizer和springApplicationRunabaleListenner相关的接口。其中listenner伴随着SpringBoot应用启动的全过程,在每个阶段运行结束的时候都会将IOC容器传入并通知所有的listenner对象,其中ConfigFileApplicationListener在SpringApplication类中就开始对配置进行解析。而在IOC初始化结束,praperContent阶段,调用this.applyInitializers(context)的时候就将解析注解的和配置的后置处理器(实现了BeanDefinitionRegistryPostProcessor得类)全部已经注册到beanFactory中的后置处理器map中,之后通过load方法将启动类加载到beanFactory中。这一切都准备好之后,进入SpringBoot的核心启动类中。在核心类中,首先做一些准备工作包括一些容器属性通过配置文件的新值覆盖等。之后获取实现了BeanDefinitionRegistryPostProcessor接口的类进行后置处理。先进行排序,找到优先级比较高的配置解析类等。然后使用先前parperContent中applyInitializers注册的ConfigurationClassPostProcessor进行注解的解析,通过这个后置处理器的处理所有的类都注册到beanDefinitionMap中。之后通过实现了BeanDefinitionRegistryPostProcessor和Order具有排序的接口,逐个调用
postProcessBeanDefinitionRegistry进行处理。
最后逐个获取beanDefinitionMap中实现了BeanDefinitionRegistryPostProcessor接口的类再去轮询调用postProcessBeanDefinitionRegistry方法。
处理完毕之后再使用相同的方法获取实现了BeanFactoryPostProcessor接口的类,还是按照优先级、排序和beanDefinitionMap注册的顺序依次调用postProcessBeanFactory方法。其实经过上述的过程,spring的主体过程已经结束了。剩下的部分就是过去bean的一些bean后置处理。现在让我们继续之前剩下的事业吧!
首先明确一下我们今天分析的焦点,如图所示:
从字面上理解,这个registerBeanPostProcessors就是注册bean的后置处理器。我们之前BeanFactoryPostProcessors是beanFactory的后置处理器。因为他们哪些方法都是在bean工厂初始化之后调用的。那么显然这里的registr就是要将bean实例化之后的一些处理的通用类注册进来。那么必然包括从spring.factories和已经加载到beanDefinitionMap的两部分类。那么这个register就是将这两者按照顺序注册的。然后再bean实例化中逐个去调用。当然这只是我们的猜测。具体是怎么样的?让我们拭目以待。
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }
public static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { //获取目前存在于beanDefinitionMap中的bean后置处理器【这里有6个】 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; //将bena的后置处理器添加到beanPostProcessor中 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); //具有优先级的bean后置处理器 ListpriorityOrderedPostProcessors = new ArrayList<>(); List internalPostProcessors = new ArrayList<>(); //具有顺序的bean后置处理器 List orderedPostProcessorNames = new ArrayList<>(); //一般的bean后置处理器 List nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); //具有优先级后置处理器添加 priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { //添加实现了MergedBeanDefinitionPostProcessor接口的后置处理器 internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { //具有顺序的bean后置处理器 orderedPostProcessorNames.add(ppName); } else { //无序的后置处理器 nonOrderedPostProcessorNames.add(ppName); } } //排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); //注册进去 registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); //注册实现了Ordered接口的bean后置处理器 List orderedPostProcessors = new ArrayList<>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); //添加到list orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { //添加MergedBeanDefinitionPostProcessor接口的bean internalPostProcessors.add(pp); } } //排序 sortPostProcessors(orderedPostProcessors, beanFactory); //注册进去 registerBeanPostProcessors(beanFactory, orderedPostProcessors); // 无序的bean后置处理器 List nonOrderedPostProcessors = new ArrayList<>(); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } //注册无序的 registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); //注册MergedBeanDefinitionPostProcessor接口的 sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); //在添加一个后置处理器 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext)); }
通过上述分析,registerBeanPostProcessors方法就是添加一批bean的初始化之后的后置处理器。
转载地址:http://qqkmi.baihongyu.com/