1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

Merge pull request #1375 from anaer/patch-29

Update SpringBoot+Spring常用注解总结.md
This commit is contained in:
Guide哥 2021-09-08 22:10:34 +08:00 committed by GitHub
commit ac930c32c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -141,11 +141,11 @@ public class UserController {
#### 2.3. `@RestController` #### 2.3. `@RestController`
`@RestController`注解是`@Controller和`@`ResponseBody`的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。 `@RestController`注解是`@Controller`和`@ResponseBody`的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。
_Guide 哥:现在都是前后端分离,说实话我已经很久没有用过`@Controller`。如果你的项目太老了的话就当我没说。_ _Guide 哥:现在都是前后端分离,说实话我已经很久没有用过`@Controller`。如果你的项目太老了的话就当我没说。_
单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。`@Controller` +`@ResponseBody` 返回 JSON 或 XML 形式数据 单独使用 `@Controller` 不加 `@ResponseBody`的话一般用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。`@Controller` +`@ResponseBody` 返回 JSON 或 XML 形式数据
关于`@RestController``@Controller`的对比,请看这篇文章:[@RestController vs @Controller](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485544&idx=1&sn=3cc95b88979e28fe3bfe539eb421c6d8&chksm=cea247a3f9d5ceb5e324ff4b8697adc3e828ecf71a3468445e70221cce768d1e722085359907&token=1725092312&lang=zh_CN#rd)。 关于`@RestController``@Controller`的对比,请看这篇文章:[@RestController vs @Controller](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485544&idx=1&sn=3cc95b88979e28fe3bfe539eb421c6d8&chksm=cea247a3f9d5ceb5e324ff4b8697adc3e828ecf71a3468445e70221cce768d1e722085359907&token=1725092312&lang=zh_CN#rd)。
@ -213,7 +213,7 @@ public ResponseEntity<List<User>> getAllUsers() {
```java ```java
@PostMapping("/users") @PostMapping("/users")
public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) { public ResponseEntity<User> createUser(@Valid @RequestBody UserCreateRequest userCreateRequest) {
return userRespository.save(user); return userRespository.save(userCreateRequest);
} }
``` ```
@ -271,7 +271,7 @@ public List<Teacher> getKlassRelatedTeachers(
} }
``` ```
如果我们请求的 url 是:`/klasses/{123456}/teachers?type=web` 如果我们请求的 url 是:`/klasses/123456/teachers?type=web`
那么我们服务获取到的数据就是:`klassId=123456,type=web` 那么我们服务获取到的数据就是:`klassId=123456,type=web`
@ -325,7 +325,7 @@ public class UserRegisterRequest {
**下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。** **下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。**
我们的数据源`application.yml`内容如下: 我们的数据源`application.yml`内容如下:
```yaml ```yaml
wuhan2020: 2020年初武汉爆发了新型冠状病毒疫情严重但是我相信一切都会过去武汉加油中国加油 wuhan2020: 2020年初武汉爆发了新型冠状病毒疫情严重但是我相信一切都会过去武汉加油中国加油
@ -345,7 +345,7 @@ library:
description: 如何养成一个新习惯?如何让心智变得更成熟?如何拥有高质量的关系? 如何走出人生的艰难时刻? description: 如何养成一个新习惯?如何让心智变得更成熟?如何拥有高质量的关系? 如何走出人生的艰难时刻?
``` ```
#### 5.1. `@value`(常用) #### 5.1. `@Value`(常用)
使用 `@Value("${property}")` 读取比较简单的配置信息: 使用 `@Value("${property}")` 读取比较简单的配置信息:
@ -380,7 +380,7 @@ class LibraryProperties {
你可以像使用普通的 Spring bean 一样,将其注入到类中使用。 你可以像使用普通的 Spring bean 一样,将其注入到类中使用。
#### 5.3. `PropertySource`(不常用) #### 5.3. `@PropertySource`(不常用)
`@PropertySource`读取指定 properties 文件 `@PropertySource`读取指定 properties 文件
@ -479,7 +479,7 @@ public class PersonController {
#### 6.3. 验证请求参数(Path Variables 和 Request Parameters) #### 6.3. 验证请求参数(Path Variables 和 Request Parameters)
**一定一定不要忘记在类上加上 `Validated` 注解了,这个参数可以告诉 Spring 去校验方法参数。** **一定一定不要忘记在类上加上 `@Validated` 注解了,这个参数可以告诉 Spring 去校验方法参数。**
```java ```java
@RestController @RestController
@ -562,7 +562,7 @@ public class Role {
private Long id; private Long id;
``` ```
JPA 使用枚举定义了 4 常见的主键生成策略,如下: JPA 使用枚举定义了 4 常见的主键生成策略,如下:
_Guide 哥枚举替代常量的一种用法_ _Guide 哥枚举替代常量的一种用法_
@ -674,7 +674,7 @@ private String userName;
设置字段类型并且加默认值,这个还是挺常用的。 设置字段类型并且加默认值,这个还是挺常用的。
```java ```java
Column(columnDefinition = "tinyint(1) default 1") @Column(columnDefinition = "tinyint(1) default 1")
private Boolean enabled; private Boolean enabled;
``` ```
@ -685,7 +685,7 @@ private Boolean enabled;
如果我们想让`secrect` 这个字段不被持久化,可以使用 `@Transient`关键字声明。 如果我们想让`secrect` 这个字段不被持久化,可以使用 `@Transient`关键字声明。
```java ```java
Entity(name="USER") @Entity(name="USER")
public class User { public class User {
...... ......
@ -699,7 +699,7 @@ public class User {
```java ```java
static String secrect; // not persistent because of static static String secrect; // not persistent because of static
final String secrect = “Satish”; // not persistent because of final final String secrect = "Satish"; // not persistent because of final
transient String secrect; // not persistent because of transient transient String secrect; // not persistent because of transient
``` ```
@ -756,7 +756,7 @@ public class Role {
} }
``` ```
数据库里面对应存储的是 MAIL/FEMAIL。 数据库里面对应存储的是 MALE/FEMALE
#### 8.7. 增加审计功能 #### 8.7. 增加审计功能
@ -808,9 +808,9 @@ public class AuditSecurityConfiguration {
} }
``` ```
简单介绍一下上面设计到的一些注解: 简单介绍一下上面涉及到的一些注解:
1. `@CreatedDate`: 表示该字段为创建时间时间字段,在这个实体被 insert 的时候,会设置值 1. `@CreatedDate`: 表示该字段为创建时间字段,在这个实体被 insert 的时候,会设置值
2. `@CreatedBy` :表示该字段为创建人,在这个实体被 insert 的时候,会设置值 2. `@CreatedBy` :表示该字段为创建人,在这个实体被 insert 的时候,会设置值
`@LastModifiedDate``@LastModifiedBy`同理。 `@LastModifiedDate``@LastModifiedBy`同理。
@ -836,7 +836,7 @@ public interface UserRepository extends JpaRepository<User, Integer> {
- `@OneToOne` 声明一对一关系 - `@OneToOne` 声明一对一关系
- `@OneToMany` 声明一对多关系 - `@OneToMany` 声明一对多关系
- `@ManyToOne` 声明多对一关系 - `@ManyToOne` 声明多对一关系
- `MangToMang`声明多对多关系 - `@MangToMang` 声明多对多关系
更多关于 Spring Boot JPA 的文章请看我的这篇文章:[一文搞懂如何在 Spring Boot 正确中使用 JPA](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485689&idx=1&sn=061b32c2222869932be5631fb0bb5260&chksm=cea24732f9d5ce24a356fb3675170e7843addbfcc79ee267cfdb45c83fc7e90babf0f20d22e1&token=292197051&lang=zh_CN#rd) 。 更多关于 Spring Boot JPA 的文章请看我的这篇文章:[一文搞懂如何在 Spring Boot 正确中使用 JPA](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485689&idx=1&sn=061b32c2222869932be5631fb0bb5260&chksm=cea24732f9d5ce24a356fb3675170e7843addbfcc79ee267cfdb45c83fc7e90babf0f20d22e1&token=292197051&lang=zh_CN#rd) 。
@ -852,14 +852,14 @@ public void save() {
``` ```
我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事在遇到非运行时异常时也回滚。 我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事在遇到非运行时异常时也回滚。
`@Transactional` 注解一般用在可以作用在`类`或者`方法`上。 `@Transactional` 注解一般可以作用在`类`或者`方法`上。
- **作用于类**:当把`@Transactional 注解放在类上时,表示所有该类的`public 方法都配置相同的事务属性信息。 - **作用于类**:当把`@Transactional` 注解放在类上时,表示所有该类的 public 方法都配置相同的事务属性信息。
- **作用于方法**:当类配置了`@Transactional`,方法也配置了`@Transactional`,方法的事务会覆盖类的事务配置信息。 - **作用于方法**:当类配置了`@Transactional`,方法也配置了`@Transactional`,方法的事务会覆盖类的事务配置信息。
更多关于关于 Spring 事务的内容请查看: 更多关于 Spring 事务的内容请查看:
1. [可能是最漂亮的 Spring 事务管理详解](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484943&idx=1&sn=46b9082af4ec223137df7d1c8303ca24&chksm=cea249c4f9d5c0d2b8212a17252cbfb74e5fbe5488b76d829827421c53332326d1ec360f5d63&token=1082669959&lang=zh_CN#rd) 1. [可能是最漂亮的 Spring 事务管理详解](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484943&idx=1&sn=46b9082af4ec223137df7d1c8303ca24&chksm=cea249c4f9d5c0d2b8212a17252cbfb74e5fbe5488b76d829827421c53332326d1ec360f5d63&token=1082669959&lang=zh_CN#rd)
2. [一口气说出 6 种 @Transactional 注解失效场景](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486483&idx=2&sn=77be488e206186803531ea5d7164ec53&chksm=cea243d8f9d5cacecaa5c5daae4cde4c697b9b5b21f96dfc6cce428cfcb62b88b3970c26b9c2&token=816772476&lang=zh_CN#rd) 2. [一口气说出 6 种 @Transactional 注解失效场景](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486483&idx=2&sn=77be488e206186803531ea5d7164ec53&chksm=cea243d8f9d5cacecaa5c5daae4cde4c697b9b5b21f96dfc6cce428cfcb62b88b3970c26b9c2&token=816772476&lang=zh_CN#rd)
@ -878,7 +878,6 @@ public class User {
private String userName; private String userName;
private String fullName; private String fullName;
private String password; private String password;
@JsonIgnore
private List<UserRole> userRoles = new ArrayList<>(); private List<UserRole> userRoles = new ArrayList<>();
} }
``` ```
@ -900,7 +899,7 @@ public class User {
#### 10.2. 格式化 json 数据 #### 10.2. 格式化 json 数据
`@JsonFormat`一般用来格式化 json 数据。 `@JsonFormat`一般用来格式化 json 数据。
比如: 比如:
@ -916,9 +915,7 @@ private Date date;
@Setter @Setter
@ToString @ToString
public class Account { public class Account {
@JsonUnwrapped
private Location location; private Location location;
@JsonUnwrapped
private PersonInfo personInfo; private PersonInfo personInfo;
@Getter @Getter