博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot源码学习(五)
阅读量:4210 次
发布时间:2019-05-26

本文共 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后置处理器    List
priorityOrderedPostProcessors = 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/

你可能感兴趣的文章
Tomcat NIO/APR对静态资源提速
查看>>
Servlet Filter与Spring interceptor的执行顺序
查看>>
使用HttpServletResponseWrapper获取渲染jsp以后的html
查看>>
Tomcat的ThreadLocalLeakPreventionListener工作原理
查看>>
利用springMVC的interceptor实现页面性能监控(Filter亦可)
查看>>
SpringMVC 拦截器实现分析
查看>>
初始化(Map,List)容器类的容量会有一定的性能提升
查看>>
StringBuffer与StringBuilder浅析
查看>>
BoneCP数据源记录SQl比hibernate的show sql好用
查看>>
对Cookie的一点认识
查看>>
说一说hibernate的Get和Load
查看>>
如何修改tomcat的server信息增加服务器的安全
查看>>
浅谈tomcat的ThreadLocalLeakPreventionListener实现原理
查看>>
说一下多线程中用到的join
查看>>
扩展hibernate Criteria的Order使其支持sql片段(oracle)
查看>>
spring+mybatis利用interceptor(plugin)实现数据库读写分离
查看>>
NIO[SelectableChannel.register和Selector.select会有锁等待冲突]
查看>>
httpclient3.1的relaseConnection的misunderstand
查看>>
ReentrantLock为啥会出现不公平的场景
查看>>
图解LinkedHashMap的LRU
查看>>