首页 简历|笔试面试

面渣逆袭Spring篇V2.0暗黑版

  • 25年9月4日 发布
  • 47.58MB 共229页
面渣逆袭Spring篇V2.0暗黑版面渣逆袭Spring篇V2.0暗黑版面渣逆袭Spring篇V2.0暗黑版面渣逆袭Spring篇V2.0暗黑版面渣逆袭Spring篇V2.0暗黑版

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

No. 1 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

前⾔

3.3 万字 180 张⼿绘图,详解 41 道 Spring ⾯试⾼频题(让天下没有难背的⼋股),⾯渣背

会这些 Spring ⼋股⽂,这次吊打⾯试官,我觉得稳了(⼿动 dog)。整理:沉默王⼆,戳转

载链接,作者:三分恶,戳原⽂链接。

亮⽩版本更适合拿出来打印,这也是很多学⽣党喜欢的⽅式,打印出来背诵的效率会更⾼。

2025 年 06 ⽉ 15 ⽇开始着⼿第⼆版更新,历经两个⽉,主要是中间有段时间把精⼒放到了派

聪明 RAG 这个项⽬的教程撰写上,第⼆版,我们升级了很多内容。

对于⾼频题,会标注在《Java ⾯试指南(付费)》中出现的位置,哪家公司,原题是什

么,并且会加 ,⽬录⼀⽬了然;如果你想节省时间的话,可以优先背诵这些题⽬,尽

快做到知彼知⼰,百战不殆。

区分⼋股精华回答版本和原理底层解释,让⼤家知其然知其所以然,同时⼜能做到⾯试时

的⾼效回答。

No. 2 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

结合项⽬(技术派、pmhub)来组织语⾔,让⾯试官最⼤程度感受到你的诚意,⽽不是

机械化的背诵。

修复第⼀版中出现的问题,包括球友们的私信反馈,⽹站留⾔区的评论,以及 GitHub 仓

库中的 issue,让这份⾯试指南更加完善。

增加⼆哥编程星球的球友们拿到的⼀些 offer,对⾯渣逆袭的感谢,以及对简历修改的⼀

些认可,以此来激励⼤家,给⼤家更多信⼼。

优化排版,增加⼿绘图,重新组织答案,使其更加⼝语化,从⽽更贴近⾯试官的预期。

⻓按识别下⾯的⼆维码,关注⼆哥的公众号,回复【222】即可拉取最新版本。

No. 3 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

当然了,请允许我的⼀点点私⼼,那就是星球的 PDF 版本会⽐公众号早⼀个⽉时间,毕竟星

球⽤户都付费过了,我有必要让他们先享受到⼀点点福利。相信⼤家也都能理解,毕竟在线

版是免费的,CDN、服务器、域名、OSS 等等都是需要成本的。

更别说我付出的时间和精⼒了,⼤家觉得有帮助还请给个⼝碑,让你身边的同事、同学都能

受益到。

No. 4 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

我把⼆哥的 Java 进阶之路、JVM 进阶之路、并发编程进阶之路,以及所有⾯渣逆袭的版本都

放进来了,涵盖 Java基础、Java集合、Java并发、JVM、Spring、MyBatis、计算机⽹络、

操作系统、MySQL、Redis、RocketMQ、分布式、微服务、设计模式、Linux 等 16 个⼤的

主题,共有 40 多万字,2000+张⼿绘图,可以说是诚意满满。

展示⼀下暗⿊版本的 PDF 吧,排版清晰,字体优雅,更加适合夜服,晚上看会更舒服⼀点。

No. 5 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

基础

1.Spring是什么?

Spring 是⼀个 Java 后端开发框架,其最核⼼的作⽤是帮我们管理 Java 对象。

No. 6 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

其最重要的特性就是 IoC,也就是控制反转。以前我们要使⽤⼀个对象时,都要⾃⼰先 new

出来。但有了 Spring 之后,我们只需要告诉 Spring 我们需要什么对象,它就会⾃动帮我们

创建好并注⼊到 Spring 容器当中。

⽐如我在⼀个 Service 类⾥需要⽤到 Dao 对象,只需要加个 @Autowired 注解,Spring 就会

⾃动把 Dao 对象注⼊到 Spring 容器当中,这样就不需要我们⼿动去管理这些对象之间的依赖

关系了。

No. 7 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

另外,Spring 还提供了 AOP,也就是⾯向切⾯编程,在我们需要做⼀些通⽤功能的时候特别

有⽤,⽐如说⽇志记录、权限校验、事务管理这些,我们不⽤在每个⽅法⾥都写重复的代

码,直接⽤ AOP 就能统⼀处理。

Spring 的⽣态也特别丰富,像 Spring Boot 能让我们快速搭建项⽬,Spring MVC 能帮我们处

理 web 请求,Spring Data 能帮我们简化数据库操作,Spring Cloud 能帮我们做微服务架构

等等。

No. 8 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

Spring有哪些特性?

Spring 的特性还是挺多的,我按照在实际⼯作/学习中⽤得最多的⼏个来说吧。

⾸先最核⼼的就是 IoC 控制反转和 DI 依赖注⼊。这个我前⾯也提到了,就是 Spring 能帮我

们管理对象的创建和依赖关系。

⽐如我写⼀个 UserService,需要⽤到 UserDao,以前得⾃⼰ new ⼀个 UserDao 出来,现在

只要在 UserService 上加个 @Service 注解,在 UserDao 字段上加个 @Autowired ,Spring

就会⾃动帮我们处理好这些依赖关系。

这样代码的耦合度就⼤⼤降低了,测试的时候也更容易 mock。

No. 9 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

第⼆个就是 AOP ⾯向切⾯编程。这个在我们处理⼀些横切关注点的时候特别有⽤,⽐如说我

们要给某些 Controller ⽅法都加上权限控制,如果没有 AOP 的话,每个⽅法都要写⼀遍加权

代码,维护起来很麻烦。

⽤了 AOP 之后,我们只需要写⼀个切⾯类,定义好切点和通知,就能统⼀处理了。事务管理

也是同样的道理,加个 @Transactional 注解就搞定了。

还有就是 Spring 对各种企业级功能的集成⽀持也特别好。⽐如数据库访问,不管我们⽤

JDBC、MyBatis-Plus 还是 Hibernate,Spring 都能很好地集成。消息队列、缓存、安全认证

这些, Spring 都有对应的模块来⽀持。

No. 10 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

另外 Spring 的配置也很灵活,既⽀持 XML 配置,也⽀持注解配置,现在我们基本都⽤注解

了,写起来更简洁。Spring Boot 出来之后就更⽅便了,约定⼤于配置,很多东⻄都是开箱即

⽤的。

简单说⼀下什么是AOP和IoC?

AOP ⾯向切⾯编程,简单点说就是把⼀些通⽤的功能从业务代码⾥抽取出来,统⼀处理。⽐

如说技术派中的 @MdcDot 注解的作⽤是配合 AOP 在⽇志中加⼊ MDC 信息,⽅便进⾏⽇志

追踪。

No. 11 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

IoC 控制反转是⼀种设计思想,它的主要作⽤是将对象的创建和对象之间的调⽤过程交给

Spring 容器来管理。⽐如说在技术派项⽬当中, @PostConstruct 注解表明这个⽅法由

Spring 容器在 Bean 初始化完成后⾃动调⽤,我们不需要⼿动调⽤ init ⽅法。

No. 12 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

Spring源码看过吗?

看过⼀些,主要是带着问题去看的,⽐如遇到⼀些技术难点或者想深⼊理解某个功能的时

候。

我重点看过的是 IoC 容器的初始化过程,特别是 ApplicationContext 的启动流程。从

refresh() ⽅法开始,包括 Bean 的定义和加载、Bean ⼯⼚的准备、Bean 的实例化和初始

化这些关键步骤。

No. 13 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

看源码的时候发现 Spring ⽤了很多设计模式,⽐如⼯⼚模式、单例模式、模板⽅法模式等

等,这对我平时写代码也很有启发。

还有就是 Spring 的 Bean ⽣命周期,从 BeanDefinition 的创建到 Bean 的实例化、属性注

⼊、初始化回调,再到最后的销毁,整个过程还是挺复杂的。看了源码之后对

@PostConstruct 、 @PreDestroy 这些注解的执⾏时机就更清楚了。

不过说实话,Spring 的源码确实⽐较难啃,涉及的概念和技术点太多了。我⼀般是结合⼀些

技术博客和 Claude ⼀起看,这样理解起来会相对容易⼀些。

PS:关于这份⼩册的 PDF 版本,⽬前只有星球的⽤户可以获取,后续会考虑开放给⼤家。

No. 14 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

1. Java ⾯试指南(付费)收录的京东⾯经同学 5 Java 后端技术⼀⾯⾯试原题:

IOC与AOP

memo:2025 年 6 ⽉ 15 ⽇修改⾄此,今天在帮球友们修改简历的时候,碰到⼀个中⼭⼤学

本硕的球友,校园荣誉基本上拉满了,⾮常优秀,那我也希望能够帮助到更多的球友们,帮

他们拿到更好的 offer。

2.Spring有哪些模块呢?

我按照平时⼯作/学习中接触的频率来说⼀下。

⾸先是 Spring Core 模块,这是整个 Spring 框架的基础,包含了 IoC 容器和依赖注⼊等核⼼

功能。还有 Spring Beans 模块,负责 Bean 的配置和管理。这两个模块基本上是其他所有模

块的基础,不管⽤ Spring 的哪个功能都会⽤到。

No. 15 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

然后是 Spring Context 上下⽂模块,它在 Core 的基础上提供了更多企业级的功能,⽐如国

际化、事件传播、资源加载这些。ApplicationContext 就是在这个模块⾥⾯的。

@SpringBootApplication

public class Application {

public static void main(String[] args) {

// Spring Boot会⾃动创建ApplicationContext

ApplicationContext context =

SpringApplication.run(Application.class, args);

}

}

Spring AOP 模块提供了⾯向切⾯编程的⽀持,我们⽤的 @Transactional 、⾃定义切⾯这些

都是基于这个模块。

No. 16 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

Web 开发⽅⾯,Spring Web 模块提供了基础的 Web 功能,Spring WebMVC 就是我们常⽤

的 MVC 框架,⽤来处理 HTTP 请求和响应。现在还有 Spring WebFlux,⽀持响应式编程。

⽐如说技术派项⽬中, GlobalExceptionHandler 类就使⽤了 @RestControllerAdvice 来

实现统⼀的异常处理。

@RestControllerAdvice

public class GlobalExceptionHandler {

@ExceptionHandler(value = ForumAdviceException.class)

public ResVo<String>

handleForumAdviceException(ForumAdviceException e) {

return ResVo.fail(e.getStatus());

}

}

数据访问⽅⾯,Spring JDBC 简化了 JDBC 的使⽤,在技术派项⽬中,我们就

JdbcTemplate 来检查表是否存在、执⾏数据库初始化脚本。

No. 17 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

Spring ORM 提供了对 MyBatis-Plus 等 ORM 框架的集成⽀持。在技术派项⽬中,我们就⽤

了 @TableName 、 @TableField 等注解进⾏对象关系映射,通过继承 BaseMapper 来获取

通⽤的 CRUD 能⼒。

Spring Test 模块提供了测试⽀持,可以很⽅便地进⾏单元测试和集成测试。我们写测试⽤例

的时候经常⽤ @SpringBootTest 这些注解。⽐如说在技术派项⽬中,我们就⽤

@SpringBootTest 注解来加载 Spring 上下⽂,进⾏集成测试。

@Slf4j

@SpringBootTest(classes = QuickForumApplication.class)

@RunWith(SpringJUnit4ClassRunner.class)

public class BasicTest {

}

还有⼀些其他的模块,⽐如 Spring Security 负责安全认证,Spring Batch 处理批处理任务等

等。

No. 18 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

现在我们基本都是⽤ Spring Boot 来开发,它把这些模块都整合好了,⽤起来更⽅便。

memo:2025 年 6 ⽉ 16 ⽇修改⾄此,今天在帮球友们修改简历的时候,碰到⼀个⼤连海事

⼤学硕河南理⼯⼤学本的球友,他荣誉奖项⾥提到的优秀研究⽣、奖学⾦、英语四六级,我

希望看到的同学也都能争取⼀下,不要把这些荣誉拱⼿让⼈,或者压根就不知道,或者不屑

于去参加,到时候你简历上这⼀栏就会⽐较苍⽩。

3.Spring有哪些常⽤注解呢?

Spring 的注解挺多的,我按照不同的功能分类来说⼀下平时⽤得最多的那些。

No. 19 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

⾸先是 Bean 管理相关的注解。 @Component 是最基础的,⽤来标识⼀个类是 Spring 组件。

像 @Service 、 @Repository 、 @Controller 这些都是 @Component 的特化版本,分别⽤

在服务层、数据访问层和控制器层。

No. 20 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

No. 21 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

依赖注⼊⽅⾯, @Autowired 是⽤得最多的,可以标注在字段、setter ⽅法或者构造⽅法

上。 @Qualifier 在有多个同类型 Bean 的时候⽤来指定具体注⼊哪⼀个。 @Resource 和

@Autowired 功能差不多,不过它是按名称注⼊的。

配置相关的注解也很常⽤。 @Configuration 标识配置类, @Bean ⽤来定义 Bean,

@Value ⽤来注⼊配置⽂件中的属性值。我们项⽬⾥的数据库连接信息、Redis 配置这些都是

⽤ @Value 来注⼊的。 @PropertySource ⽤来指定配置⽂件的位置。

No. 22 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

Web 开发的注解就更多了。 @RestController 相当于 @Controller 加 @ResponseBody ,

⽤来做 RESTful 接⼝。

No. 23 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

@RequestMapping 及其变体 @GetMapping 、 @PostMapping 、 @PutMapping 、

@DeleteMapping ⽤来映射 HTTP 请求。 @PathVariable 获取路径参数, @RequestParam

获取请求参数, @RequestBody 接收 JSON 数据。

AOP 相关的注解, @Aspect 定义切⾯, @Pointcut 定义切点, @Before 、 @After 、

@Around 这些定义通知类型。

不过我们⽤得最多的还是 @Transactional ,基本上 Service 层需要保证事务原⼦性的⽅法都

会加上这个注解。

⽣命周期相关的, @PostConstruct 在 Bean 初始化后执⾏, @PreDestroy 在 Bean 销毁前

执⾏。测试的时候 @SpringBootTest 也经常⽤到。

No. 24 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

还有⼀些 Spring Boot 特有的注解,⽐如 @SpringBootApplication 这个启动类注解,

@ConditionalOnProperty 做条件装配, @EnableAutoConfiguration 开启⾃动配置等

等。

No. 25 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

1. Java ⾯试指南(付费)收录的微众银⾏同学 1 Java 后端⼀⾯的原题:说说

Spring 常⻅的注解?

memo:2025 年 6 ⽉ 17 ⽇修改⾄此,今天在帮球友们修改简历的时候,碰到⼀个学院本的

球友,他的荣誉奖项还是 OK的,态度也⾮常好,之前有学院本球友拿到滴滴 SP offer 的,希

望这位球友也能够成为星球⾥新的榜样。

No. 26 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

4. Spring⽤了哪些设计模式?

Spring 框架⾥⾯确实⽤了很多设计模式,我从平时⼯作中能观察到的⼏个来说说。

⾸先是⼯⼚模式,这个在 Spring ⾥⽤得⾮常多。BeanFactory 就是⼀个典型的⼯⼚,它负责

创建和管理所有的 Bean 对象。我们平时⽤的 ApplicationContext 其实也是 BeanFactory 的

⼀个实现。当我们通过 @Autowired 获取⼀个 Bean 的时候,底层就是通过⼯⼚模式来创建

和获取对象的。

单例模式也是 Spring 的默认⾏为。默认情况下,Spring 容器中的 Bean 都是单例的,整个应

⽤中只会有⼀个实例。这样可以节省内存,提⾼性能。当然我们也可以通过 @Scope 注解来

改变 Bean 的作⽤域,⽐如设置为 prototype 就是每次获取都创建新实例。

No. 27 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

代理模式在 AOP 中⽤得特别多。Spring AOP 的底层实现就是基于动态代理的,对于实现了

接⼝的类⽤ JDK 动态代理,没有实现接⼝的类⽤ CGLIB 代理。⽐如我们⽤

@Transactional 注解的时候,Spring 会为我们的类创建⼀个代理对象,在⽅法执⾏前后添

加事务处理逻辑。

模板⽅法模式在 Spring ⾥也很常⻅,⽐如 JdbcTemplate。它定义了数据库操作的基本流

程:获取连接、执⾏ SQL、处理结果、关闭连接,但是具体的 SQL 语句和结果处理逻辑由我

们来实现。

No. 28 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

观察者模式在 Spring 的事件机制中有所体现。我们可以通过 ApplicationEvent 和

ApplicationListener 来实现事件的发布和监听。⽐如⽤户注册成功后,我们可以发布⼀个⽤户

注册事件,然后有多个监听器来处理后续的业务逻辑,⽐如发送邮件、记录⽇志等。

No. 29 / 229

⾯渣逆袭Spring篇V2-让天下所有的⾯渣都能逆袭

这些设计模式的应⽤让 Spring 框架既灵活⼜强⼤,也让我在实际的开发中学到很多经典的设

计思想。

Spring如何实现单例模式?

传统的单例模式是在类的内部控制只能创建⼀个实例,⽐如⽤ private 构造⽅法加 static

getInstance() 这种⽅式。但是 Spring 的单例是容器级别的,同⼀个 Bean 在整个 Spring

容器中只会有⼀个实例。

具体的实现机制是这样的:Spring 在启动的时候会把所有的 Bean 定义信息加载进来,然后

在 DefaultSingletonBeanRegistry 这个类⾥⾯维护了⼀个叫 singletonObjects 的

ConcurrentHashMap,这个 Map 就是⽤来存储单例 Bean 的。key 是 Bean 的名称,value

就是 Bean 的实例对象。

No. 30 / 229

开通会员 本次下载免费

所有资料全部免费下载! 推荐用户付费下载获取返佣积分! 积分可以兑换商品!
普通用户: 8.17元
网站会员:
本次下载免费

开通网站会员 享专属特权

  • 会员可免费

    下载全部资料!

  • 推荐用户下载

    获取返佣积分!

  • 积分可以

    兑换商品!

一键复制 下载文档 联系客服