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

2023-09-10 11:03:16 +08:00
 zhiyu1998

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

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

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

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

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

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

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

好处就是 统一管理、解耦

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

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

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

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

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

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

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

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

目前我在刷 spring 的面试题。
Aresxue
2023-09-11 15:09:00 +08:00
面试是没有固定公式的,但对于某些固定的问题确实存在着套路,最基本的 3w ( what-how-why )原则就很好用。
比如 aop 这个命题, 什么是 aop?怎样使用 aop ?为什么需要 aop ?这些内容相对浮于表面但如果面试并不是什么大公司,面试官的水平也没有多高可能也就够用了。再向下挖掘,动态代理/静态代理 -> jdk 代理/cglib 代理 -> 字节码改写 asm/javasist -> agent -> jvmti -> jvm 源码等等,知识是有层次的,对应面试这件事情来说先选定目标公司,然后比面试公司的平均面试深度再深一个 level 一般就够用了,因为很多东西一下子是学不完的,你可以参考常见的面试题,对其中提到的知识点做些分层再做出合适的评估。
zhiyu1998
2023-09-11 20:05:29 +08:00
@Aresxue 感谢,中肯的建议!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/972420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX