请教一个面试问题:关于 Spring 底层问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhiyu1998
V2EX    Java

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

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

    我看到很多面试官在面试的时候,尤其是中大厂都会提问: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     Solana     1654 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 16:19 PVG 00:19 LAX 09:19 JFK 12:19
    Do have faith in what you're doing.
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11940834-2', 'v2ex.com'); ga('send', 'pageview'); ga('send', 'event', 'Node', 'topic', 'java'); ubao msn 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