V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxc1234
V2EX  ›  程序员

想系统学下 spring

  •  1
     
  •   zxc1234 · 2020-05-02 01:28:37 +08:00 · 4227 次点击
    这是一个创建于 1453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    工作快 5 年,用过 spring 也懂一些,但是感觉里面的源码不熟悉

    想找个方向学习一下,但是不知道怎么入手

    用的话是没啥问题,但是面试一问深一点,就答不上来了

    看源码的话,也不知道先看哪些,再看哪些比较好

    迷茫~求指教~

    17 条回复    2020-05-02 12:21:51 +08:00
    Zetroy
        1
    Zetroy  
       2020-05-02 04:55:27 +08:00   ❤️ 1
    1. 先把 spring 你用到部分的相关的源码从 github 上拉下来
    2. 研究怎么把这个项目给 build 出来 (这步可能超级难,而且需要电脑性能好,也可能需要下载大量的东西)
    3. 从交互的部分入手,或者从自己使用的那些功能入手,找项目里面的对应的代码。
    4. 或者从启动的部分入手,找真正的那个 main 方法开始读。
    Zetroy
        2
    Zetroy  
       2020-05-02 04:56:11 +08:00
    @Zetroy 然后你就可以自己改动 spring 了,做各种实验。
    cs419
        3
    cs419  
       2020-05-02 06:51:15 +08:00
    ## 方向

    spring 核心的初始化 与运行时 (bean 的 ioc 、di)
    spring mvc 的初始化 与运行时 (或其他服务 aop)
    spring 与 任意软件整合 的初始化 与运行时 (比如 mybatis)

    ## 思路
    可以先用 mybatis 与 spring 项目共用, 但不整合的使用
    然后 二者整合使用 分析下整合实现了啥功能,咋实现的

    初始化阶段 hook 接口的执行顺序
    延申到与 spring 整合的软件 对 hook 的实践

    同理 hibernate 咋共用 。。。等等

    spring 作为胶水 与很多框架都能整合
    要点都是 init 、runtime 、hook

    ## 通用思路
    阅读源码
    一方面是装逼格
    另一方面就是有这方面(修改源码或编写类似服务)需求

    分析一个(或编写)软件需要有
    大致的初始化阶段 与运行阶段
    而软件为了有较好的扩展性,就会提供较多的 hook
    jimiy
        4
    jimiy  
       2020-05-02 07:26:51 +08:00 via Android
    @Zetroy 电脑性能好一点编译,test,也就 30 分钟
    xizismile
        5
    xizismile  
       2020-05-02 07:42:28 +08:00 via Android   ❤️ 1
    一上来就看源码,没有方向感,你会懵的
    推荐看 spring 官方文档,里面每个小节的知识点划分的很清楚,看一个小节的知识点,就配合着做一下练习题,调试一下源码,还有其它不懂的就看看博客啥的。一点点攻破,这样的学习我感觉是比较好的
    学习路线,spring――springboot――springcloud
    lhx2008
        6
    lhx2008  
       2020-05-02 07:52:53 +08:00 via Android
    看了半天源码,面试官问你为啥用 sring,你还是不知道
    Zetroy
        7
    Zetroy  
       2020-05-02 08:13:58 +08:00
    @lhx2008 写几个 patch,到时候 “spring 核心开发者” 糊脸,哈哈哈哈哈。
    sariya
        8
    sariya  
       2020-05-02 08:30:38 +08:00 via Android
    有条件在实战中边学边用是最有效率的,所以适当找些练手项目,不然对着源码看几眼就想睡觉了
    Zetroy
        9
    Zetroy  
       2020-05-02 08:41:02 +08:00 via Android
    @sariya 我觉得可以给 spring 写个或大或小或搞笑的新模块什么的。
    zzzzzzggggggg
        10
    zzzzzzggggggg  
       2020-05-02 09:58:12 +08:00
    先明白为什么要使用 spring,spring 帮你解决了什么问题
    然后思考如果不用 spring,你会如何实现需求
    最后带着这些问题去分模块的看
    chendy
        11
    chendy  
       2020-05-02 10:01:29 +08:00
    文档熟悉么?不熟悉先去看文档,再去有选择地看源码
    chihiro2014
        12
    chihiro2014  
       2020-05-02 10:17:14 +08:00   ❤️ 1
    可以去看下知秋的 Spring framework 源码解读系列
    https://www.bilibili.com/video/BV1FE41177oz
    cabing
        13
    cabing  
       2020-05-02 10:34:01 +08:00
    @zzzzzzggggggg 这个是正解。

    带着目的去做,比盲目看源码有效和快速的多。

    加入让你实现 spring 类似的框架,你应该怎么做? spring 有哪些地方可以再改进下,魔改下。
    zzzzzzggggggg
        14
    zzzzzzggggggg  
       2020-05-02 10:52:58 +08:00
    @cabing 对,之前初学的时候强行撸源码,真的是迷失了...还是得带着目的看,不然容易乱
    lewis89
        15
    lewis89  
       2020-05-02 10:57:19 +08:00   ❤️ 3
    每次遇到想看 Spring 的源码的 ,我都给劝退了,无它 这个东西本身没什么好看的,里面一大堆的 corner case,这些工业框架源代码 膨胀了这么多年,有很多历史遗留代码在里面,光是为了擦 Java 反射 API 的屁股的功能类就好大一坨代码,Spring Core 里面像 Utils 结尾的 都是这些东西。

    实际上核心的 Spring 就解决了 那么几个问题

    1.IoC 容器 装配对象 让对象组件化 ,如果你不需要太复杂的功能,完全可以用一个 Map 就能轻松搞定,注意下循环依赖就好

    2.AOP 提供一个切面代理,实际上就是一个代理模式,无非它是用了 CGLib 字节码之类的魔改,本质上跟你编写一个新的 Java 类去代理 是一回事,只不过它这个步骤是通过编程接口完成的,而非手工生成代理类


    大多看源码的是为了面试的时候 好找个话题聊,显得你很专业,我建议直接看下极客时间的 小马哥 Spring
    源码都是摘取一部分来看,并不是从头看到尾,主要是省时间,你从头看到尾,没有任何意义。


    如果是应付面试跟工作也差不多了,毕竟 Spring 的核心扩展 实际上就 两个接口 BeanFactoryPostProcessor BeanPostProcessor 其余能够扩展 Spring 功能接口 大多都是从这两个接口 派生过去的, 一个是对 BeanFactory 做功能增强的,一个是给 Bean 做功能增强的。
    lewis89
        16
    lewis89  
       2020-05-02 10:59:14 +08:00
    @lewis89 #15 其余 Spring Core 还提供了一些边边角角的东西,像 Message 之类的,但是因为不常用,所以不想提,毕竟现在都是微服务,在单体进程里面发消息没有任何意义。
    zzzzzzggggggg
        17
    zzzzzzggggggg  
       2020-05-02 12:21:51 +08:00
    @lewis89 赞,成熟的开源框架和库里面处理 corner case 的代码实在太多了,看重点就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   984 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 21:09 · PVG 05:09 · LAX 14:09 · JFK 17:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.