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

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

  •  
  •   zhiyu1998 · 230 天前 · 2597 次点击
    这是一个创建于 230 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    好处就是 统一管理、解耦

    缺点无非就是 降低了性能
    Ericcccccccc
        6
    Ericcccccccc  
       230 天前
    比较好的回答可以是为什么会需要 AOP, 搞明白了这一点原理啥的就水到渠成了.
    zhiyu1998
        7
    zhiyu1998  
    OP
       230 天前
    @kuituosi 可能培训班的老师也不会太注重这种,偏应用多一些吧

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

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

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

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

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

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

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

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