为什么 spring 源码中类的关系那么复杂? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
BlackZhu
V2EX    程序员

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

  •  1
     
  •   BlackZhu 2022-03-26 20:49:25 +08:00 4603 次点击
    这是一个创建于 1293 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在读 spring 源码,发现其中的类关系真让人头大,一层一层的继承实现太繁杂了,比如一个抽象方法往往要往下走好几层才会有具体的实现!
    这是 spring 本身的设计理念,还是随着项目的发展迭代出来的结果?
    26 条回复    2023-02-05 13:04:19 +08:00
    bthulu
        1
    bthulu  
       2022-03-26 20:52:11 +08:00
    迭代了 N 年的结果啊, 当年比较注重面向对象, 各种设计模式来一遍, 自然是一层套一层越套越多了
    thinkershare
        2
    thinkershare  
       2022-03-26 20:57:40 +08:00
    因为计算机科学中, 没有什么问题是通过添加一个抽象无法解决的, 如果不行, 就再加一个抽象. 所以后来有了: 如无必要、勿增实体. 而什么是必要就是一个哲学问题了! 每一个添加的抽象都是为了某个切面需求概率的抽象.
    forgottencoast
        3
    forgottencoast  
       2022-03-26 21:05:36 +08:00
    应该要研究他这样做的意义。
    BlackZhu
        4
    BlackZhu  
    OP
       2022-03-26 21:11:06 +08:00
    @bthulu 所以说这算是一种缺陷? 如果官方团队有机会重构的话 会放弃这种理念 选择更加精简的方式吗


    @forgottencoast 我就是不太懂这样做的意义 在自己的项目中也有必要采用这种设计方式吗? 对项目是好处大还是坏处大?
    thinkershare
        5
    thinkershare  
       2022-03-26 21:34:10 +08:00   1
    @BlackZhu 如果你的项目中, 你无法搞清楚抽象的目的, 就不要抽象. 每个人都只能试图看的稍微远一点, 预测非常永久的事情纯粹是赌运气. 抽象是有代价的, 你需要了评估你项目的复杂度, 没有一个放之四海而皆准的办法, 设计就是平衡矛盾的需求, 平衡的好, 就是有效设计.
    thinkershare
        6
    thinkershare  
       2022-03-26 21:36:09 +08:00
    另外你说的 Spring 的抽象设计在它的体系中是没啥问题的! 官方团队即便重构大差不大还是这个样子, 除非需求发生了重大变化, 软件设计就是尽量让代码贴近需求的自然抽象, 越是自然, 则未来越是容易维护和扩展!
    ikas
        7
    ikas  
       2022-03-26 23:25:24 +08:00
    spring 曾经是相对于 javaee 的轻量级框架..
    当时随着应用的广泛,必然会增加各种需求啊..才逐渐形成了如今的样子..
    Braisdom
        8
    Braisdom  
       2022-03-27 09:31:36 +08:00
    Sping 是一个高度抽象的框架,为了适应各种系统的需求,才会产生各种抽象,本质上是为了适应变化,但这样做也是有成本的,也就是导致框架代码很难理解,各种抽象概念、各种关系起来越复杂。天下大事,分久必合,合久必分,现在一些比较轻量级的框架也在产生。
    haha512
        9
    haha512  
       2022-03-27 14:37:02 +08:00
    过度设计,都其他为项目准备勾画好了未来 20 年的需要
    但实际 99%的项目不到 5 年都死了或者重构了(哈哈
    murmur
        10
    murmur  
       2022-03-27 15:48:44 +08:00
    @haha512 初始版本:2002 年 10 月 1 日,也就是说很快 spring 就迎来 20 年生日了
    zoharSoul
        11
    zoharSoul  
       2022-03-27 15:57:21 +08:00
    spring 的风格, 你看 golang 的很多框架就没这么玩
    FreeEx
        12
    FreeEx  
       2022-03-27 17:09:12 +08:00
    所以我都不读源码,这些框架都不是一次性写好的,而是经过了大量时间缝缝补补,Spring 当年相对 EJB 也算轻量,现在也变成了一个庞然大物,屠龙勇士终成恶龙?
    FrankHB
        13
    FrankHB  
       2022-03-27 17:22:03 +08:00
    @thinkershare 显然有,比如抽象太多并且泄露出来被用户发现了的这种 OP 问题。
    slyang5
        14
    slyang5  
       2022-03-27 20:03:54 +08:00
    @zoharSoul 只能说 go 的框架还不成熟, 面向的用户还不够大众
    thinkershare
        15
    thinkershare  
       2022-03-27 21:38:15 +08:00
    @FrankHB 他去看源代码, 当然任何实现细节都会被发现!
    bigbyto
        16
    bigbyto  
       2022-03-27 21:58:18 +08:00   1
    源码不是这样读的,先看借口抽象文档,再看细节实现。理解了接口,就不会觉得复杂。
    shyangs
        17
    shyangs  
       2022-03-28 00:44:35 +08:00
    Java 好像有一套一的梗 /搞笑,版友有存的可以上.
    nothingistrue
        18
    nothingistrue  
       2022-03-28 10:01:50 +08:00
    面向对象编程第一个解决的问题:让开发类库的人和使用类库的人可以分开。开发 Spring ,和使用 Spring 开发业务,一个是开发类库,一个是使用类库开发业务,你不能那一个标准去看源码。
    frank1256
        19
    frank1256  
       2022-03-28 16:12:41 +08:00
    20 年的代码,能看懂已经不复杂了
    git00ll
        20
    git00ll  
       2022-03-28 17:24:28 +08:00
    拿当初 spring1 的代码放到现在 spring5 里面,仍然兼容。
    这不正是说明设计的很棒吗
    jeesk
        21
    jeesk  
       2022-04-18 00:03:49 +08:00 via Android   4
    我以前关注过一个公众号, 说是要读就从 spring 0.9 开始读, 当时我觉得他是垃圾。 两年后过去了,我觉得他很牛,现在才知道别人是在 oracle 和 ibm 呆过的大神。 因为 spring 就是 管理和创建 bean ,依赖注入 解决依赖循环, 其它的无非是 spring 的拓展。 我第一个框架阅读是的 google juice 的源码,第一个版本只有 20 个类, 我 debug 了一天才看懂基本原理。 又用了一天,看看懂了设计模式, 现在想想要是大牛早点说服我,我至少进步好几年。spring 无非也是这样, 第一个版本的 banfactory 现在还在用, 所以你把 spring 0.9 的源码读了, 再去循序渐进的看 spring 5.0 的源码就简单多了。 因为原理你在 0.9 就知道了,其它的无非就是拓展。 即使是 spring 的作者现在也不一定能马上看懂了。 你给自己写个目标, 先.09 看, 再 2.0 ,3.0 , 循序渐进, 我敢打赌 你看完能虐面试官
    jeesk
        22
    jeesk  
       2022-04-18 00:07:18 +08:00 via Android
    所有的源代码都是从第一个版本看的, 这样看还可以让你明白, 为什么代码会改成这样, 有种豁然开朗的感觉我。 。 用这个方法我已经把 spring ,tomcat .h2database, mybatis 弄熟了。 你这样玩下去, 面试官随便虐。 太有成就感了。
    jeesk
        23
    jeesk  
       2022-04-18 00:16:18 +08:00 via Android
    @Braisdom 我们项目在 storm 和 flink 用的是 juice , 很轻量。 老大不让用 spring , 依赖难搞。 现在用得爽得一批。
    BlackZhu
        24
    BlackZhu  
    OP
       2022-04-23 13:27:40 +08:00
    @jeesk 感谢 确实是很好的想法
    zardmyLove
        25
    zardmyLove  
       2023-02-05 11:08:44 +08:00
    @jeesk 大佬,很好的想法啊,我去试试,能和大佬交流一下吗
    jeesk
        26
    jeesk  
       2023-02-05 13:04:19 +08:00
    @zardmyLove 加我 wechatid(base64): bGlua3NoaXJsZXk=
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5737 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:21 PVG 14:21 LAX 23:21 JFK 02:21
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86