专栏首页求道记一次向Spring官方提交PR的失败经历

记一次向Spring官方提交PR的失败经历

有道无术,术尚可求也!有术无道,止于术!

一、事情始末

周末无聊在家,打开Spring源码,想再温习一遍之前学习过的流程,忽然看到一段代码,就是在执行BeanFactoryPostProcessor的逻辑中我发现了这样奇怪的一幕:

事情原委

于是我就把代码改成这个样子(草率了

草率了

于是乎,整个代码都简便多了,当时随手写了一个测试类,没报错就直接提交到Spring项目上了,然后申请合并了,当我怀着激动的心,颤抖的手,提交完成之后,一天我都十分亢奋,是不是的打开github,看看作者回复了我没有!

二、终于,草率了!

到了下午三四点左右的时间,作者回复我了(都是英文,我用谷歌给你翻译一波),截图如下:

image-20200911090438959

当时我刚从公司出门,骑着我的小电驴,怎么都想不明白,为什么会被拒?为什么?

因此,我打算回家,和这两个人好好争论一番(诸葛亮舌战群儒)!!!

然而,然而,我在走到回家路上的一个红绿灯的一瞬间灵机一动、无中生有、暗度陈仓、凭空想象、凭空捏造,我莫名其妙的想明白了!是!我!错!了!

三、错误原因

众所周知,我们在BeanFactoryPostProcessor里面是可以修改类的BeanDefinition里面的属性的,假设,按照我修改的做法,遍历的时候就实例化,后面直接执行,会出现什么问题呢?看一段代码:

假设,我现在有两个BeanFactoryPostProcessor

低级别的:

/**
 * 低级别的BeanFactoryPostProcessor
 *
 * @author huangfu
 * @date 2020年9月11日09:16:41
 */
@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
 @Override
 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  System.out.println("我心态崩了呀!");
 }
}

高级别的:

/**
 * 高级别的BeanPostProcessors
 *
 * @author huangfu
 * @date 2020年9月11日09:15:35
 */
@Component
public class PriorityOrderedBeanFactoryPostProcessors implements BeanFactoryPostProcessor, PriorityOrdered {
 @Override
 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
  GenericBeanDefinition genericBeanDefinition = (GenericBeanDefinition) beanFactory.getBeanDefinition("myBeanFactoryPostProcessor");
  System.out.println("-----------MyBeanPostProcessors -------------------");
  //这里就是修改了myBeanFactoryPostProcessor的BeanClass 不具体写了
  genericBeanDefinition.setBeanClass(XXXXXX.class);
 }

 @Override
 public int getOrder() {
  return 0;
 }
}

可以看到,高级别的修改了低级别的BeanFactoryPostProcessor! 按照Spring原来的逻辑,

  1. 先把高级别的PriorityOrderedBeanFactoryPostProcessors初始化了
  2. 然后把低级别的beanName放到容器里面!
  3. 遍历完成之后,先执行高级别的PriorityOrderedBeanFactoryPostProcessors,修改了低级别的BeanDefinition
  4. 低级别的因为值存在了一个BeanName,那么在执行之前会先去容器里面获取被高级别的修改后的BeanDefinition
  5. 然后执行低级别的BeanFactoryPostProcessor,此时执行的就是被高级别修改后的逻辑!

那么,我修改后的逻辑会出什么样的问题呢?

我们还是按照上述代码,执行一遍我自己修改后的逻辑!

  1. 先把高级别的PriorityOrderedBeanFactoryPostProcessors初始化了
  2. 再把低级别的初始化了!
  3. 执行高级别的PriorityOrderedBeanFactoryPostProcessors,修改了低级别的BeanDefinition
  4. 因为此时低级别在高级别修改之前就已经初始化完了,那么PriorityOrderedBeanFactoryPostProcessors的修改压根就没生效!
  5. OMG,此时就出现了问题,明明我在高级别的后置处理器中做了对于低级别的后置处理器的修改,但是却莫名没有生效,你说尴尬不!

四、总结

整个事情的始末就是这样,不知道你看懂了吗?

虽然这次闹了一个大乌龙吧,但是如果不是因为这一茬事,我压根不会往这上面想,总的来说,对我是有益的!哈哈哈!

大家有时候在阅读源码的时候,发现有不合理的地方,经过自己的试验之后尽管向上提,大不了不通过呗!通过一次次失败的经历,再不济也会让你对源码的掌握提升一个级别!好一点的话,你就能成为一些顶级开源项目的代码贡献者哦!相信这是每一个热衷技术人的追求!

好了,本期就到这里了,欢迎关注作者,作者最近会更新一个Spring源码精读的系列文章,我会带你从头到尾的去过一遍Spring的源码!欢迎关注作者【JAVA程序狗】

才疏学浅,如果文章中理解有误,欢迎大佬们私聊指正!欢迎关注作者的公众号,一起进步,一起学习!

本文分享自微信公众号 - JAVA程序狗(javacxg),作者:皇甫嗷嗷叫

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试官问我Volatile的原理?从操作系统层面的设计怼回去!

    在多线程并发编程中,synchronized和volatile都扮演着及其重要的角色;可以这么说,Volatile是轻量级的synchronized!volat...

    止术
  • 你知道Spring中BeanFactoryPostProcessors是如何执行的吗?

    了解了BeanDefinition以及生命周期的大概概念之后,我们可以试着看一下源码!我们上一章也说到,BeanFactoryPostProcessors的执行...

    止术
  • 分布式事务种类介绍

    参与者将本身事务的执行情况发送给事务协调者,由事务协调者判断事务调用链是否执行提交操作还是回滚操作

    止术
  • Difference Between V

    Raw device mapping size (virtual compatibility) 2TB minus 512 bytes

    py3study
  • 编程小白 | 每日一练(58)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通
  • [Android]安卓9安装Xposed框架

    前两天把自己手机升级到了Android P也就是安卓9.0升级后才发现无法安装Xposed框架,Xposed框架真的是个神器,模块各种各样的都有,搞机必备,所以...

    爱游博客
  • Tesseract Ocr文字识别

    Java中文社群_老王
  • Tesseract Ocr文字识别

    Tesseract的OCR引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。2005年,Tesseract由美...

    Java中文社群_老王
  • 工具 | sqlmap系列(四)高级篇

    SQLMAP系列终于来到了高级篇,是进阶篇的延续……,本期斗哥将带你走进sqlmap批量扫描的世界。 一.批量化扫描burp的请求日记 01.首先配置burp记...

    漏斗社区
  • python错误:distutils.e

    [root@host73 python]# python setup.py install

    py3study

扫码关注云+社区

领取腾讯云代金券