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

请教一个面试问题:关于 Spring 底层问题

  •  
  •   zhiyu1998 ·
    zhiyu1998 · 2023-09-10 11:03:16 +08:00 · 2858 次点击
    这是一个创建于 434 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看到很多面试官在面试的时候,尤其是中大厂都会提问:Spring AOP 的底层原理,或者说 Spring IOC 的原理。

    请问遇到这种问题该如何回答才能让面试官觉得满意?这种问题我也有问过 GPT 或者上 Spring 官方文档看,感觉如果按照上面的来说也不是很全面,例如 Proxying Mechanisms 。如果看源码的话可能要考虑的东西太多了,求各位懂的哥哥帮助一下。

    17 条回复    2023-09-11 20:05:29 +08:00
    BBCCBB
        1
    BBCCBB  
       2023-09-10 11:41:42 +08:00
    动态代理, 责任链模式, 什么 Proxy 只能代理基于接口的类, 还有就是他的抽象的接口, Advice, Advisor, pointcut 之类的吧.
    还有就是 aop 的缺陷, 比如 this 调用会导致失效, 不能 static method 之类的.

    个人理解.
    sorra
        2
    sorra  
       2023-09-10 12:06:27 +08:00
    推荐自行用 JDK 动态代理和 CgLib 写一遍,动手写一个简单的 IoC 容器,这样从原理入手能节省看源码的时间(因为源码的信息量太大了)。当然你也可以从源码入手,但可能更费时间。
    只要你懂了来回答,自然能让面试官满意,不懂当然不能让面试官满意。
    zhiyu1998
        3
    zhiyu1998  
    OP
       2023-09-10 12:52:25 +08:00
    @BBCCBB 感谢分享经验,但是感觉这个还是有点笼统,难以理解

    @sorra ok ,这个好像是比较好的解决方案了
    kuituosi
        4
    kuituosi  
       2023-09-10 13:29:32 +08:00 via Android
    spring 的基本原理还是需要懂的,有的大厂还会涉及具体细节。实在不行就报个培训班吧
    javaisthebest
        5
    javaisthebest  
       2023-09-10 13:47:55 +08:00
    首先你的理解下为什么出现 AOP 这个功能,我个人理解是这样的

    在我们的应用着,不仅存在着 应用服务( Web Api ,功能性 API) 也存在着大量的系统功能(性能统计、日志)。这些功能点逻辑分散在应用功能中,与应用代码耦合性高,分散性强。不便于统一管理。

    所以就出现了 AOP , 面向切面。把系统功能 像一把刀横切在应用流程中。

    好处就是 统一管理、解耦

    缺点无非就是 降低了性能
    Ericcccccccc
        6
    Ericcccccccc  
       2023-09-10 13:52:49 +08:00
    比较好的回答可以是为什么会需要 AOP, 搞明白了这一点原理啥的就水到渠成了.
    zhiyu1998
        7
    zhiyu1998  
    OP
       2023-09-10 14:20:03 +08:00
    @kuituosi 可能培训班的老师也不会太注重这种,偏应用多一些吧

    @javaisthebest 这个回答好像 GPT 的那种回答,所以我才觉得不够底层

    @Ericcccccccc 现在已经是马桶堵住渠成不了了😂
    BBCCBB
        8
    BBCCBB  
       2023-09-10 15:29:47 +08:00
    你可以看这块源码, 就不笼统了, 我是看过的
    securityCoding
        9
    securityCoding  
       2023-09-10 16:37:07 +08:00
    IOC 就是 spring 帮你省去手动 new object 同时帮你管理生命周期,AOP 本质是无侵入式增强方法。
    zhiyu1998
        10
    zhiyu1998  
    OP
       2023-09-10 16:37:45 +08:00
    @BBCCBB 图片好像没了
    diagnostics
        11
    diagnostics  
       2023-09-10 16:41:24 +08:00
    为什么需要 IOC:对象依赖关系复杂,需要一个自动化帮忙做注入,以及 Spring 的 Bean 基本上没有状态而言的,因此只需要单例就好

    如何实现:简单维护一个 Bean 的注册表(假设是 HashMap ),另一个 Bean 创建的时候,假设有依赖是需要注入的,到这个注册表查有没有(类型、同类型下对比 beanName )-> 假如该 Bean 没有,则尝试加载这个 Bean ,否则异常退出

    我不是 Spring 专家,只在刚毕业看了一些、并且会用而已,按照我的理解我会这么写。。。Spring 无非就是增加了很多设计模式把代码优化了(但是复杂了更难懂)
    ikas
        12
    ikas  
       2023-09-10 21:45:52 +08:00
    这个问题很多时候要看面试官想要关注什么..

    如果是自身想要搞清楚,其实去看 spring 作者的书就可以了.来龙去脉
    expert one-on-one J2EE Development without EJB
    liyunyang
        13
    liyunyang  
       2023-09-11 09:10:47 +08:00
    想请问一下,哪里可以系统学习一下 spring 底层的这些东西?

    是不是一定要花钱买网上那些源码课程?

    有什么推荐的书籍吗?
    Ayanokouji
        14
    Ayanokouji  
       2023-09-11 10:05:19 +08:00
    关于 ioc ,可以尝试换种思路,如果不用 ioc 需要怎么做。比如用 go ,一般都是全局变量。两种方式进行比较,可能会对 ioc 认识的比较深。
    dif
        15
    dif  
       2023-09-11 14:35:54 +08:00
    @liyunyang 系统的学很慢,很枯燥,很容易放弃。不如多刷刷 spring 的面试题。遇到一个,先尝试自己能不能解释的通,解释不通就看答案,对答案不明白再去看相关的介绍或者源码。

    目前我在刷 spring 的面试题。
    Aresxue
        16
    Aresxue  
       2023-09-11 15:09:00 +08:00   ❤️ 1
    面试是没有固定公式的,但对于某些固定的问题确实存在着套路,最基本的 3w ( what-how-why )原则就很好用。
    比如 aop 这个命题, 什么是 aop?怎样使用 aop ?为什么需要 aop ?这些内容相对浮于表面但如果面试并不是什么大公司,面试官的水平也没有多高可能也就够用了。再向下挖掘,动态代理/静态代理 -> jdk 代理/cglib 代理 -> 字节码改写 asm/javasist -> agent -> jvmti -> jvm 源码等等,知识是有层次的,对应面试这件事情来说先选定目标公司,然后比面试公司的平均面试深度再深一个 level 一般就够用了,因为很多东西一下子是学不完的,你可以参考常见的面试题,对其中提到的知识点做些分层再做出合适的评估。
    zhiyu1998
        17
    zhiyu1998  
    OP
       2023-09-11 20:05:29 +08:00
    @Aresxue 感谢,中肯的建议!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5634 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:37 · PVG 09:37 · LAX 17:37 · JFK 20:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.