转载请注明出处 :
CNBLOG地址:https://www.cnblogs.com/christmad/p/9173958.html
CSDN地址:https://blog.csdn.net/qq_33741986/article/details/80667231
最近在阅读spring源码,有关IOC容器创建的部分。本文讲的是我在看到容器创建核心方法 的AbstractApplicationContext#refresh() 中的第五步:invokeBeanFactoryPostProcessors(beanFactory); 时发现的一些“有趣的”代码,贴图如下,注释已经在图中:
相信大家已经学到了...
那么 5.0.X 对比 4.3.11 版本,新版本在此方法上的改动为:使用一个
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
代替了
List<BeanDefinitionRegistryPostProcessor> priorityOrderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
和
List<BeanDefinitionRegistryPostProcessor> orderedPostProcessors = new ArrayList<BeanDefinitionRegistryPostProcessor>();
invokeBeanFactoryPostProcessors(beanFactory); 支持在bean被实例化前修改 BeanDefinition,当我们的程序出现大批量的类BeanDefinition(有共同接口)需要修改时,新增一个BeanFactoryPostProcessors就可以实现。
开发人员只需实现 BeanFactoryPostProcessors#postProcessBeanDefinitionRegistry() 接口 和 它的父类接口 BeanFactoryPostProcessor#postProcessBeanFactory() 。
我在学习源码时没有找到好的学习笔记,看了不少文章,瑕疵很多,大部分只是在某个方法上理出了一些头绪,几乎没有能把refresh()主体逻辑理顺出来的,这个和源码接口数量多以及涉及的原理内容对大部分java工作者比较晦涩有很大的关系。所以看的时候直接参考那样的系列文章的话,会看的比较头疼。所以前后找了一个多星期之后,没有再继续找更好的文章,而是在自己看源码的过程中,需要理顺哪个方法就具体的去查相关的方法,找到思路比较通顺的笔记后就可以开始进行辩证地阅读。
过程当中自己做笔记是绝对有必要的,除非学习者脑回路清奇能一下子记住那么多前后来回回调的方法顺序,笔记也不是非要不可。不过本人水平有限,仍然在使用做笔记的方法进行源码学习。比如在看到spring如何解析XML中配置的bean信息这部分源码时,当我看到SAX接口时就做下笔记“spring使用sax接口将xml转成dom树进行解析”,做成一个记忆点,将来如果想深入学习spring如何解析各个标签时可以再拓展,因为直接展开又将是一个非常消耗时间和精力的阶段等着你,因此懂得点到为止也是学习源码时必须掌握的技巧。