• 请不要在回答技术问题时复制粘贴 AI 生成的内容
BlackZhu
V2EX  ›  程序员

为什么 spring 源码中类的关系那么复杂?

  •  1
     
  •   BlackZhu · Mar 26, 2022 · 5028 views
    This topic created in 1508 days ago, the information mentioned may be changed or developed.
    最近在读 spring 源码,发现其中的类关系真让人头大,一层一层的继承实现太繁杂了,比如一个抽象方法往往要往下走好几层才会有具体的实现!
    这是 spring 本身的设计理念,还是随着项目的发展迭代出来的结果?
    26 replies    2023-02-05 13:04:19 +08:00
    bthulu
        1
    bthulu  
       Mar 26, 2022
    迭代了 N 年的结果啊, 当年比较注重面向对象, 各种设计模式来一遍, 自然是一层套一层越套越多了
    thinkershare
        2
    thinkershare  
       Mar 26, 2022
    因为计算机科学中, 没有什么问题是通过添加一个抽象无法解决的, 如果不行, 就再加一个抽象. 所以后来有了: 如无必要、勿增实体. 而什么是必要就是一个哲学问题了! 每一个添加的抽象都是为了某个切面需求概率的抽象.
    forgottencoast
        3
    forgottencoast  
       Mar 26, 2022
    应该要研究他这样做的意义。
    BlackZhu
        4
    BlackZhu  
    OP
       Mar 26, 2022
    @bthulu 所以说这算是一种缺陷? 如果官方团队有机会重构的话 会放弃这种理念 选择更加精简的方式吗


    @forgottencoast 我就是不太懂这样做的意义 在自己的项目中也有必要采用这种设计方式吗? 对项目是好处大还是坏处大?
    thinkershare
        5
    thinkershare  
       Mar 26, 2022   ❤️ 1
    @BlackZhu 如果你的项目中, 你无法搞清楚抽象的目的, 就不要抽象. 每个人都只能试图看的稍微远一点, 预测非常永久的事情纯粹是赌运气. 抽象是有代价的, 你需要了评估你项目的复杂度, 没有一个放之四海而皆准的办法, 设计就是平衡矛盾的需求, 平衡的好, 就是有效设计.
    thinkershare
        6
    thinkershare  
       Mar 26, 2022
    另外你说的 Spring 的抽象设计在它的体系中是没啥问题的! 官方团队即便重构大差不大还是这个样子, 除非需求发生了重大变化, 软件设计就是尽量让代码贴近需求的自然抽象, 越是自然, 则未来越是容易维护和扩展!
    ikas
        7
    ikas  
       Mar 26, 2022
    spring 曾经是相对于 javaee 的轻量级框架..
    当时随着应用的广泛,必然会增加各种需求啊..才逐渐形成了如今的样子..
    Braisdom
        8
    Braisdom  
       Mar 27, 2022
    Sping 是一个高度抽象的框架,为了适应各种系统的需求,才会产生各种抽象,本质上是为了适应变化,但这样做也是有成本的,也就是导致框架代码很难理解,各种抽象概念、各种关系起来越复杂。天下大事,分久必合,合久必分,现在一些比较轻量级的框架也在产生。
    haha512
        9
    haha512  
       Mar 27, 2022
    过度设计,都其他为项目准备勾画好了未来 20 年的需要
    但实际 99%的项目不到 5 年都死了或者重构了(哈哈
    murmur
        10
    murmur  
       Mar 27, 2022
    @haha512 初始版本:2002 年 10 月 1 日,也就是说很快 spring 就迎来 20 年生日了
    zoharSoul
        11
    zoharSoul  
       Mar 27, 2022
    spring 的风格, 你看 golang 的很多框架就没这么玩
    dushixiang
        12
    dushixiang  
       Mar 27, 2022
    所以我都不读源码,这些框架都不是一次性写好的,而是经过了大量时间缝缝补补,Spring 当年相对 EJB 也算轻量,现在也变成了一个庞然大物,屠龙勇士终成恶龙?
    FrankHB
        13
    FrankHB  
       Mar 27, 2022
    @thinkershare 显然有,比如抽象太多并且泄露出来被用户发现了的这种 OP 问题。
    slyang5
        14
    slyang5  
       Mar 27, 2022
    @zoharSoul 只能说 go 的框架还不成熟, 面向的用户还不够大众
    thinkershare
        15
    thinkershare  
       Mar 27, 2022
    @FrankHB 他去看源代码, 当然任何实现细节都会被发现!
    bigbyto
        16
    bigbyto  
       Mar 27, 2022   ❤️ 1
    源码不是这样读的,先看借口抽象文档,再看细节实现。理解了接口,就不会觉得复杂。
    shyangs
        17
    shyangs  
       Mar 28, 2022
    Java 好像有這種一層套一層的梗圖 /搞笑圖,版友有存的可以貼上來.
    nothingistrue
        18
    nothingistrue  
       Mar 28, 2022
    面向对象编程第一个解决的问题:让开发类库的人和使用类库的人可以分开。开发 Spring ,和使用 Spring 开发业务,一个是开发类库,一个是使用类库开发业务,你不能那一个标准去看源码。
    frank1256
        19
    frank1256  
       Mar 28, 2022
    20 年的代码,能看懂已经不复杂了
    git00ll
        20
    git00ll  
       Mar 28, 2022
    拿当初 spring1 的代码放到现在 spring5 里面,仍然兼容。
    这不正是说明设计的很棒吗
    jeesk
        21
    jeesk  
       Apr 18, 2022 via Android   ❤️ 4
    我以前关注过一个公众号, 说是要读就从 spring 0.9 开始读, 当时我觉得他是垃圾。 两年后过去了,我觉得他很牛,现在才知道别人是在 oracle 和 ibm 呆过的大神。 因为 spring 就是 管理和创建 bean ,依赖注入 解决依赖循环, 其它的无非是 spring 的拓展。 我第一个框架阅读是的 google juice 的源码,第一个版本只有 20 个类, 我 debug 了一天才看懂基本原理。 又用了一天,看看懂了设计模式, 现在想想要是大牛早点说服我,我至少进步好几年。spring 无非也是这样, 第一个版本的 beanfactory 现在还在用, 所以你把 spring 0.9 的源码读了, 再去循序渐进的看 spring 5.0 的源码就简单多了。 因为原理你在 0.9 就知道了,其它的无非就是拓展。 即使是 spring 的作者现在也不一定能马上看懂了。 你给自己写个目标, 先.09 看, 再 2.0 ,3.0 , 循序渐进, 我敢打赌 你看完能虐面试官
    jeesk
        22
    jeesk  
       Apr 18, 2022 via Android
    所有的源代码都是从第一个版本看的, 这样看还可以让你明白, 为什么代码会改成这样, 有种豁然开朗的感觉我。 😁。 用这个方法我已经把 spring ,tomcat .h2database, mybatis 弄熟了。 你这样玩下去, 面试官随便虐。 太有成就感了。
    jeesk
        23
    jeesk  
       Apr 18, 2022 via Android
    @Braisdom 我们项目在 storm 和 flink 用的是 juice , 很轻量。 老大不让用 spring , 依赖难搞。 现在用得爽得一批。
    BlackZhu
        24
    BlackZhu  
    OP
       Apr 23, 2022
    @jeesk 感谢 确实是很好的想法
    zardmyLove
        25
    zardmyLove  
       Feb 5, 2023
    @jeesk 大佬,很好的想法啊,我去试试,能和大佬交流一下吗
    jeesk
        26
    jeesk  
       Feb 5, 2023
    @zardmyLove 加我 wechatid(base64): bGlua3NoaXJsZXk=
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   923 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 21:29 · PVG 05:29 · LAX 14:29 · JFK 17:29
    ♥ Do have faith in what you're doing.