← 返回文章流

Spring八股整理.md

# Spring八股整理 ## 重点 1. 三级缓存 2. jdk动态代理与cglib代理 3. springboot自动装配原理 4. spring事务失效场景 ## 常见注解 按照 Spring Boot 开发时的分层结构记忆: | 注解 | 作用 | | ------------- | ------------------------------------ | | `@Controller` | 标注控制层组件,负责处理 HTTP 请求 | | `@Service` | 标注业务逻辑层组件,负责处理业务逻辑 | | `@Repository` | 标注数据访问层组件,负责数据库访问 | ### HTTP 请求映射注解 由于在 controller 层往往会处理 http 请求,根据不同的请求方法选择对应的 service 层,因此有以下常见的注解: | 注解 | 作用 | | ---------------- | ---------------------------------- | | `@GetMapping` | 处理 GET 请求,通常用于查询数据 | | `@PostMapping` | 处理 POST 请求,通常用于新增数据 | | `@PutMapping` | 处理 PUT 请求,通常用于更新数据 | | `@DeleteMapping` | 处理 DELETE 请求,通常用于删除数据 | ### HTTP 响应注解 Controller 层处理完请求后,需要将结果返回给客户端,通常以 JSON 格式返回。 - `@Controller`:默认将方法返回的字符串视为视图名称,通过视图解析器查找并渲染对应页面(如 HTML) - `@ResponseBody`:将方法返回值直接写入 HTTP 响应体,不进行视图解析。返回 Java 对象时,通常会自动序列化为 JSON - `@RestController`:相当于 `@Controller` + `@ResponseBody`,默认将方法返回值写入 HTTP 响应体,适用于前后端分离开发(restful api) 核心区别: `@Controller` 默认偏向视图解析,而 `@RestController` 默认直接返回响应数据。 #### @Controller 示例 只使用 @Controller 注解,会将返回的字符串进行视图解析,返回对应的HTML ```java @Controller public class UserController { @GetMapping("/user") public String user() { return "user"; } } ``` 这里返回的 `"user"` 并不是直接发送给浏览器,而是作为视图名称,由 Spring MVC 的视图解析机制处理 例如使用 Thymeleaf 时,可以解析到: ```java src/main/resources/templates/user.html ``` 然后渲染 HTML 页面并返回给浏览器;如果要返回 JSON,可以添加 `@ResponseBody` 注解: ```java @Controller public class UserController { @ResponseBody @GetMapping("/user") public User user() { return new User(1, "张三"); } } ``` Spring MVC 会通过合适的 `HttpMessageConverter` 将对象序列化,常见情况下使用 Jackson 转换为 JSON ### HTTP 请求参数注解 - `@RequestBody`:用于接收前端传递的 JSON 数据 前端发送 post 请求: ```json { "name": "张三", "age": 20 } ``` 后端接受数据:@RequestBody 注解 ```java @RestController public class UserController { @PostMapping("/user") public String addUser(@RequestBody User user) { // RequestBody 接受前端传递的JSON数据 return user.getName(); } } ``` ### 依赖注入注解 - `@Autowired`:Spring 提供的依赖注入注解,默认按照类型从 IoC 容器中查找 Bean 并注入 ## @Autowired 注解与 @Resource 注解的区别 可以通过 @Autowired 与 @Resource 注入 Bean 到对应属性中,但存在不同: 1. `@Autowired` 是 Spring 提供的注解,`@Resource` 是 java EE 标准提供的注解 2. 两者都用于依赖注入,核心区别在于匹配方式: - `@Autowired` 默认按类型匹配,同类型存在多个 Bean 时,可以结合名称等条件进一步筛选 - `@Resource` 默认先按名称匹配,未指定名称且名称匹配失败时,再按类型匹配 ## spring 核心组成模块 - spring-core 与 spring-beans:提供 IoC 容器的基础实现,管理 Bean 的创建与装配 - spring-web:web应用初始化 - spring-context:应用上下文,好像是企业级功能 - spring-test:提供 JUnit 单元测试等 ## IOC与DI IoC(控制反转,Inversion of Control),就是由 Spring 容器来控制和管理对象,不用手动进行 new 创建,以及销毁 DI:由于对象都交由 Spring 容器管理,后续使用对象时进行依赖注入即可 ## 依赖注入方式有哪些? 1. 构造函数注入:通过类的构造函数来注入依赖项。 2. Setter 注入:通过类的 Setter 方法来注入依赖项。 3. Field(字段) 注入:直接在类的字段上使用注解(如 `@Autowired` 或 `@Resource`)来注入依赖项。 构造函数注入示例: ```java @Service public class UserService { private final UserRepository userRepository; // final 修饰 public UserService(UserRepository userRepository) { this.userRepository = userRepository; } //... } ``` Setter 注入示例: ```java @Service public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } //... } ``` Field 注入示例: ```java @Service public class UserService { @Autowired private UserRepository userRepository; //... } ``` ## 构造函数注入与setter注入的区别是? - 依赖完整性:构造函数注入要求在创建对象时就提供必须依赖,而 setter 注入可以在创建对象后再设置依赖 - 不可变性:构造函数注入通常配合 final 修饰依赖字段,避免后续被重新赋值 - 适用场景:两者适用场景不同,构造函数注入适合必须依赖,而 setter 注入则适合可选依赖 记忆重点:构造函数注入 = 必需依赖 + `final`;Setter 注入 = 可选依赖 + 可重新设置 构造函数注入示例: ```java @Service public class UserService { private final UserRepository userRepository; // final public UserService(UserRepository userRepository) { this.userRepository = userRepository; } //... } ``` Setter 注入示例: ```java @Service public class UserService { private UserRepository userRepository; @Autowired public void setUserRepository(UserRepository userRepository) { this.userRepository = userRepository; } //... } ``` 两者使用时的差别:构造函数注入是“创建时传入依赖”,Setter 注入是“创建后设置依赖” ```java // 构造函数注入:创建对象时必须传入依赖 UserService service = new UserService(userRepository); // Setter 注入:先创建对象,再设置依赖 UserService service = new UserService(); service.setUserRepository(userRepository); ``` 需要注意:以上两种写法是为了说明 Java 对象的创建方式。在实际 Spring 开发中,通常由 Spring 容器负责创建对象并完成依赖注入,而不是手动 `new` ## Bean 的生命周期 > Spring Bean 的生命周期类似于 Vue 组件的生命周期,开发者可以在不同阶段执行对应的业务逻辑,例如初始化资源、释放资源等 > > 视频:[一个例子讲明白 Spring Bean 的生命周期](https://www.bilibili.com/video/BV1n9k4BJEoP/?spm_id_from=333.337.search-card.all.click&vd_source=8c5774f0412cfb872126f5a44585db4f) ### Bean 生命周期的主要阶段 Spring Bean 的生命周期可以简化为以下 5 个阶段: ![image-20261024120513420](https://oss.tilex.world/d/blog-images/2026/10/24/image-20261024120513420.png?sign=KNm_llNVAItxYyA033AHCcSfQGTZ4b9ZS7k2vQ2QNr0=:0) 1. **实例化**:Spring 容器创建 Bean 实例 2. **属性赋值**:Spring 为 Bean 注入所需的依赖,例如通过 Setter 方法或字段注入 3. **初始化**:依赖注入完成后,执行初始化逻辑,例如 `@PostConstruct` 或配置的 `initMethod` 4. **使用**:Bean 初始化完成后,可以被其他组件使用,执行业务逻辑 5. **销毁**:Spring 容器关闭时,执行销毁回调,例如 `@PreDestroy` 或配置的 `destroyMethod`,用于释放资源 其中,常见的生命周期注解有: | 注解 | 执行时机 | 主要用途 | | ---------------- | -------------- | -------------------- | | `@PostConstruct`

作者:Tilex作者主页
在原博客阅读全文 (新标签页打开)

以上内容来自博客订阅源,版权归原作者。关注作者后可以在 关注列表 第一时间查看作者文章。

一起聊聊 0

尊重不同观点

还没有评论。欢迎分享第一个想法。

RSS SUBSCRIPTIONS

选择 RSS 订阅

把博客汇的文章添加到你常用的阅读器。

关注文章 RSS 订阅本订阅需要登录后使用