Skip to content

Commit ee45675

Browse files
committed
Update Spring and readme docs with new content and images
Expanded explanations in the Spring MVC and Spring Boot sections, including more details on RESTful interface flow, Spring Boot features, and auto-configuration principles. Added new images and updated memos reflecting recent user feedback and experiences. The readme was updated with an additional testimonial image and related text.
1 parent 92b0cb0 commit ee45675

File tree

2 files changed

+45
-56
lines changed

2 files changed

+45
-56
lines changed

docs/src/sidebar/sanfene/spring.md

Lines changed: 42 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3209,102 +3209,87 @@ memo:2025 年 7 月 18 日修改至此,今天在[帮球友修改简历时](h
32093209

32103210
![荣誉奖项基本拉满的球友](https://cdn.tobebetterjavaer.com/stutymore/spring-20250718111849.png)
32113211

3212-
### 32.SpringMVC Restful 风格的接口的流程是什么样的呢
3212+
### 32.SpringMVC Restful 风格的接口流程是什么样的呢
32133213

3214-
PS:这是一道全新的八股,毕竟 ModelAndView 这种方式应该没人用了吧?现在都是前后端分离接口,八股也该更新换代了
3214+
在传统的 MVC 中,Controller 方法通常返回一个视图名称或者 ModelAndView 对象,然后由视图解析器 ViewResolver 解析并渲染成 HTML 页面。但在 RESTful 架构中,通常返回的是 JSON 或 XML,不再是一个完整的页面
32153215

3216-
我们都知道 Restful 接口,响应格式是 json,这就用到了一个常用注解:**@ResponseBody**
3216+
其中很重要的两个注解:`@RestController` 相当于 `@Controller``@ResponseBody` 的结合。当在一个类上使用 `@RestController` 时,它会告诉 Spring 这个类中所有方法的返回值都应该被直接写入 HTTP 响应体中,而不再被解析为视图。
32173217

3218-
```java
3219-
@GetMapping("/user")
3220-
@ResponseBody
3221-
public User user(){
3222-
return new User(1,"张三");
3223-
}
3224-
```
3225-
3226-
加入了这个注解后,整体的流程上和使用 ModelAndView 大体上相同,但是细节上有一些不同:
3227-
3228-
![Spring MVC Restful请求响应示意图](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/spring-2da963a0-5da9-4b3a-aafd-fd8dbc7e1807.png)
3218+
`@ResponseBody` 可以用在方法级别,作用相同。它标志着该方法的返回值将作为响应体内容,Spring 会跳过视图解析的步骤。
32293219

3230-
1. 客户端向服务端发送一次请求,这个请求会先到前端控制器 DispatcherServlet
3220+
HttpMessageConverter 是实现 RESTful 风格的关键。当 Spring 检测到 `@ResponseBody` 注解时,它会使用 HttpMessageConverter 来将 Controller 方法返回的 Java 对象序列化成指定的格式,如 JSON。
32313221

3232-
2. DispatcherServlet 接收到请求后会调用 HandlerMapping 处理器映射器。由此得知,该请求该由哪个 Controller 来处理
3222+
默认情况下,如果类路径下有 Jackson 库,Spring Boot 会自动配置 MappingJackson2HttpMessageConverter 来处理 JSON 的转换。相应的,对于带有 `@RequestBody` 注解的方法参数,它也会用这个转换器将请求体中的 JSON 数据反序列化成 Java 对象。
32333223

3234-
3. DispatcherServlet 调用 HandlerAdapter 处理器适配器,告诉处理器适配器应该要去执行哪个 Controller
3224+
![技术派源码:MappingJackson2HttpMessageConverter](https://cdn.tobebetterjavaer.com/stutymore/spring-20250719102056.png)
32353225

3236-
4. Controller 被封装成了 ServletInvocableHandlerMethod,HandlerAdapter 处理器适配器去执行 invokeAndHandle 方法,完成对 Controller 的请求处理
3226+
所以,RESTful 接口的流程可以概括为:请求到达前端控制器 DispatcherServlet → 通过 HandlerMapping 找到对应的 Controller 方法 → 执行方法并返回数据 → 使用 HttpMessageConverter 将数据转换为 JSON 或 XML 格式 → 直接写入 HTTP 响应体。
32373227

3238-
5. HandlerAdapter 执行完对 Controller 的请求,会调用 HandlerMethodReturnValueHandler 去处理返回值,主要的过程:
3228+
![三分恶面渣逆袭:Spring MVC Restful请求响应示意图](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/spring-2da963a0-5da9-4b3a-aafd-fd8dbc7e1807.png)
32393229

3240-
5.1. 调用 RequestResponseBodyMethodProcessor,创建 ServletServerHttpResponse(Spring 对原生 ServerHttpResponse 的封装)实例
3230+
总结来说,RESTful 接口的流程通过 `@RestController` 和 HttpMessageConverter “抄了近道”,省略了 ViewResolver 和 View 的渲染过程,直接将数据转换为指定的格式返回,非常适合前后端分离的应用场景。
32413231

3242-
5.2.使用 HttpMessageConverter 的 write 方法,将返回值写入 ServletServerHttpResponse 的 OutputStream 输出流中
3243-
3244-
5.3.在写入的过程中,会使用 JsonGenerator(默认使用 Jackson 框架)对返回值进行 Json 序列化
3232+
<MZNXQRcodeBanner />
32453233

3246-
6. 执行完请求后,返回的 ModealAndView 为 null,ServletServerHttpResponse 里也已经写入了响应,所以不用关心 View 的处理
3234+
memo:2025 年 7 月 19 日修改至此,今天有[球友](https://javabetter.cn/zhishixingqiu/)私信我说,拿到了京东的实习 offer,问接下来的秋招该怎么准备?那 7 月份实习 Offer 确实会比较少,但仍然有一部分,如果这个阶段还想要冲实习的话,确实可以捡漏。
32473235

3248-
<MZNXQRcodeBanner />
3236+
![球友拿到京东实习 offer 了](https://cdn.tobebetterjavaer.com/stutymore/spring-20250719103018.png)
32493237

32503238
## Spring Boot
32513239

3252-
### 33.🌟介绍一下 SpringBoot,有哪些优点
3240+
### 33.🌟介绍一下 SpringBoot?
32533241

3254-
Spring Boot 提供了一套默认配置,它通过约定大于配置的理念,来帮助我们快速搭建 Spring 项目骨架
3242+
Spring Boot 可以说是 Spring 生态的一个重大突破,它极大地简化了 Spring 应用的开发和部署过程
32553243

32563244
![SpringBoot图标](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/spring-d9164ee6-5c86-4313-8fd9-efb9acfa5f0b.png)
32573245

3258-
以前的 Spring 开发需要配置大量的 xml 文件,并且需要引入大量的第三方 jar 包,还需要手动放到 classpath 下。现在只需要引入一个 Starter,或者一个注解,就可以轻松搞定。
3246+
以前我们用 Spring 开发项目的时候,需要配置一大堆 XML 文件,包括 Bean 的定义、数据源配置、事务配置等等,非常繁琐。而且还要手动管理各种 jar 包的依赖关系,很容易出现版本冲突的问题。部署的时候还要单独搭建 Tomcat 服务器,整个过程很复杂。Spring Boot 就是为了解决这些痛点而生的。
3247+
3248+
“约定大于配置”是 Spring Boot 最核心的理念。它预设了很多默认配置,比如默认使用内嵌的 Tomcat 服务器,默认的日志框架是 Logback 等等。这样,我们开发者就只需要关注业务逻辑,不用再纠结于各种配置细节。
32593249

3260-
Spring Boot 的优点非常多,比如说
3250+
自动装配也是 Spring Boot 的一大特色,它会根据项目中引入的依赖自动配置合适的 Bean。比如说,我们引入了 Spring Data JPA,Spring Boot 就会自动配置数据源;比如说,我们引入了 Spring Security,Spring Boot 就会自动配置安全相关的 Bean。
32613251

3262-
1. Spring Boot 内嵌了 Tomcat、Jetty、Undertow 等容器,直接运行 jar 包就可以启动项目。
3263-
2. Spring Boot 内置了 Starter 和自动装配,避免繁琐的手动配置。例如,如果项目中添加了 spring-boot-starter-web,Spring Boot 会自动配置 Tomcat 和 Spring MVC。
3264-
3. Spring Boot 内置了 Actuator 和 DevTools,便于调试和监控。
3252+
Spring Boot 还提供了很多开箱即用的功能,比如 Actuator 监控、DevTools 开发工具、Spring Boot Starter 等等。Actuator 可以让我们轻松监控应用的健康状态、性能指标等;DevTools 可以加快开发效率,比如自动重启、热部署等;Spring Boot Starter 则是一些预配置好的依赖集合,让我们可以快速引入某些常用的功能。
32653253

32663254
#### Spring Boot常用注解有哪些?
32673255

3268-
1. **@SpringBootApplication**:Spring Boot 应用的入口,用在启动类上。
3269-
2. 还有一些 Spring 框架本身的注解,比如 **@Component****@RestController****@Service****@ConfigurationProperties****@Transactional** 等。
3256+
Spring Boot 的注解很多,我就挑两个说一下吧。
3257+
3258+
- `@SpringBootApplication`:这是 Spring Boot 的核心注解,它是一个组合注解,包含了 `@Configuration``@EnableAutoConfiguration``@ComponentScan`。它标志着一个 Spring Boot 应用的入口。
3259+
- `@SpringBootTest`:用于测试 Spring Boot 应用的注解,它会加载整个 Spring 上下文,适合集成测试。
32703260

32713261
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经中出现过该题:讲讲 Spring Boot 的特性。
32723262
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的百度面经同学 1 文心一言 25 实习 Java 后端面试原题:SpringBoot基本原理
32733263
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的国企零碎面经同学 9 面试原题:Springboot基于Spring的配置有哪几种
32743264
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的阿里云面经同学 22 面经:springboot常用注解
32753265
3266+
memo:2025 年 7 月 20 日修改至此,今天又有[球友](https://javabetter.cn/zhishixingqiu/jianli.html)发私信说,后悔没有早一点加入星球,加入星球后,才发现大家早早就为自己的未来去拼搏了。很真实,好吧,这就是星球的价值所在,100 多块钱的门票就能提供学校几万学费给你不了的东西。
32763267

3277-
### 34.🌟SpringBoot 自动配置原理了解吗?
3278-
3279-
在 Spring 中,自动装配是指容器利用反射技术,根据 Bean 的类型、名称等自动注入所需的依赖。
3268+
![球友对星球的认可](https://cdn.tobebetterjavaer.com/stutymore/spring-从学校到职场,一般都这样,正常的,想干了,.png)
32803269

3281-
![三分恶面渣逆袭:SpringBoot自动配置原理](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/spring-df77ee15-2ff0-4ec7-8e65-e4ebb8ba88f1.png)
3270+
### 34.🌟Spring Boot的自动装配原理了解吗?
32823271

3283-
在 Spring Boot 中,开启自动装配的注解是`@EnableAutoConfiguration`
3272+
在 Spring Boot 中,开启自动装配的注解是`@EnableAutoConfiguration`这个注解会告诉 Spring 去扫描所有可用的自动配置类。
32843273

32853274
![二哥的 Java 进阶之路:@EnableAutoConfiguration 源码](https://cdn.tobebetterjavaer.com/stutymore/spring-20240316121711.png)
32863275

3287-
Spring Boot 为了进一步简化,直接通过 `@SpringBootApplication` 注解一步搞定,该注解包含了 `@EnableAutoConfiguration` 注解
3276+
Spring Boot 为了进一步简化,把这个注解包含到了 `@SpringBootApplication` 注解中。也就是说,当我们在主类上使用 `@SpringBootApplication` 注解时,实际上就已经开启了自动装配
32883277

3289-
main 类启动的时候,Spring Boot 会通过底层的`AutoConfigurationImportSelector` 类加载自动装配类
3278+
main 方法运行的时候,Spring 会去类路径下找 `spring.factories` 这个文件,读取里面配置的自动配置类列表。比如在我们的[技术派项目](https://javabetter.cn/zhishixingqiu/paicoding.html)中,paicoding-core 和 paicoding-service 模块里都有 spring.factories,分别注册了 ForumCoreAutoConfig 和 ServiceAutoConfig,这两个配置类就会在项目启动的时候被自动加载
32903279

3291-
```java
3292-
@AutoConfigurationPackage //将main同级的包下的所有组件注册到容器中
3293-
@Import({AutoConfigurationImportSelector.class}) //加载自动装配类 xxxAutoconfiguration
3294-
public @interface EnableAutoConfiguration {
3295-
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
3280+
![技术派源码:spring.factories](https://cdn.tobebetterjavaer.com/stutymore/spring-20250726163615.png)
32963281

3297-
Class<?>[] exclude() default {};
3282+
然后每个自动配置类内部,通常会有一个 `@Configuration` 注解,同时结合各种 `@Conditional` 注解来做条件控制。像[技术派](https://javabetter.cn/zhishixingqiu/paicoding.html)的 RabbitMqAutoConfig 类,就用了 `@ConditionalOnProperty` 注解来判断配置文件里有没有开启 rabbitmq.switchFlag,来决定是否初始化 RabbitMQ 消费线程。
32983283

3299-
String[] excludeName() default {};
3300-
}
3301-
```
3284+
![技术派源码:RabbitMqAutoConfig](https://cdn.tobebetterjavaer.com/stutymore/spring-20250726163759.png)
33023285

3303-
`AutoConfigurationImportSelector`实现了`ImportSelector`接口,该接口的作用是收集需要导入的配置类,配合 `@Import()` 将相应的类导入到 Spring 容器中
3286+
另外一个常见的场景是自动注入 Bean,比如[技术派](https://javabetter.cn/zhishixingqiu/paicoding.html)的 ServiceAutoConfig 中就用了 `@ComponentScan` 来扫描 service 包,`@MapperScan` 扫描 MyBatis 的 mapper 接口,实现业务层和 DAO 层的自动装配
33043287

3305-
![二哥的 Java 进阶之路:AutoConfigurationImportSelector源码](https://cdn.tobebetterjavaer.com/stutymore/spring-20240316122134.png)
3288+
具体的执行过程可以总结为:Spring Boot 项目在启动时加载所有的自动配置类,然后逐个检查它们的生效条件,当条件满足时就实例化并创建相应的 Bean。
33063289

3307-
获取注入类的方法是 `selectImports()`,它实际调用的是`getAutoConfigurationEntry()`,这个方法是获取自动装配类的关键。
3290+
![三分恶面渣逆袭:Spring Boot的自动装配原理](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/spring-df77ee15-2ff0-4ec7-8e65-e4ebb8ba88f1.png)
3291+
3292+
自动装配的执行时机是在 Spring 容器启动的时候。具体来说是在 ConfigurationClassPostProcessor 这个 BeanPostProcessor 中处理的,它会解析 `@Configuration` 类,包括通过 `@Import` 导入的自动配置类。
33083293

33093294
```java
33103295
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
@@ -3342,15 +3327,17 @@ protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata an
33423327
}
33433328
```
33443329

3345-
总结:Spring Boot 的自动装配原理依赖于 Spring 框架的依赖注入和条件注册,通过这种方式,Spring Boot 能够智能地配置 bean,并且只有当这些 bean 实际需要时才会被创建和配置。
3346-
33473330
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的滴滴同学 2 技术二面的原题:SpringBoot 启动时为什么能够自动装配
33483331
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯面经同学 22 暑期实习一面面试原题:Spring Boot 如何做到启动的时候注入一些 bean
33493332
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的比亚迪面经同学 3 Java 技术一面面试原题:说一下 Spring Boot 的自动装配原理
33503333
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的农业银行同学 1 面试原题:spring boot 的自动装配
33513334
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的百度面经同学 1 文心一言 25 实习 Java 后端面试原题:SpringBoot如何实现自动装配
33523335
> 6. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的 OPPO 面经同学 1 面试原题:自动配置怎么实现的?
33533336
3337+
memo:2025 年 7 月 21 日修改至此,今天有[球友](https://javabetter.cn/zhishixingqiu/jianli.html)发私信说,拿到了亚信科技+新石器无人车的 offer,问我该如何选择,如果是你,你会如何选择呢?
3338+
3339+
![亚信科技+新石器无人车的 offer](https://cdn.tobebetterjavaer.com/stutymore/spring-20250726164552.png)
3340+
33543341
### 35.🌟如何自定义一个 SpringBoot Srarter?
33553342

33563343
创建一个自定义的 Spring Boot Starter,需要这几步:

docs/src/zhishixingqiu/readme.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ head:
3030
![少走弯路](https://cdn.tobebetterjavaer.com/stutymore/readme-20250415090742.png)
3131

3232

33-
学习的路上最缺的就是清晰的学习路线、优质的学习资料和良好的学习氛围,二哥的编程星球恰好就能给你提供这样的服务,目前优惠完仅需 129 块钱,对比一下别的付费社群,你就知道这个价格有多诚意!
33+
学习的路上最缺的就是清晰的学习路线、优质的学习资料和良好的学习氛围,二哥的编程星球恰好就能给你提供这样的服务,目前优惠完仅需 129 块钱,对比一下别的付费社群,你就知道这个价格有多诚意!甚至之前有碰到过,有球友在加入前不敢相信这个价格是真的。
34+
35+
![球友不敢相信这是真的](https://cdn.tobebetterjavaer.com/stutymore/readme-20250722171412.png)
3436

3537
## 一、星球取得的成绩
3638

0 commit comments

Comments
 (0)