Spring;SpringBoot常用注解总结
2022-11-29 14:00:19 33 举报
AI智能生成
根据 JavaGuide 绘制的脑图
作者其他创作
大纲/内容
@SpringBootApplication
这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上:
我们可以把 @SpringBootApplication 看作是 @Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。
根据 SpringBoot 官网,这三个注解的作用分别是:
- @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
- @ComponentScan: 扫描被 @Component (@Repository,@Service,@Controller) 注解的 bean,注解默认会扫描该类所在的包下所有的类。
- @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
Spring Bean 相关
自动导入 Bean 对象到类中
@AutoWired 注解可以自动导入对象到类中,被注入进的类同样要被 Spring 容器管理:
将 Bean 类注入到 Spring 组件
我们一般使用 @Autowired 注解让 Spring 容器帮我们自动装配 bean。要想把
类标识成可被 @Autowired 注解自动装配的 bean 类,可以采用以下注解实现:
类标识成可被 @Autowired 注解自动装配的 bean 类,可以采用以下注解实现:
@Component
:通用的注解,可标注任意类为Spring
组件。如果一个 Bean 不知道属于哪个层,可以使用@Component
注解标注。@Repository
: 对应持久层即 Dao 层,主要用于数据库相关操作。@Service
: 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。@Controller
: 对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。
控制器 Bean
@RestController 注解是 @Controller 和 @ResponseBody 的合集,表示这是个控制器 bean,
并且是 将函数的返回值 直接填入 HTTP 响应体中,是 REST 风格的控制器。
并且是 将函数的返回值 直接填入 HTTP 响应体中,是 REST 风格的控制器。
单独使用 @Controller 不加 @ResponseBody 的话一般是用在要返回一个视图的情况,
这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。
@Controller +@ResponseBody 返回 JSON 或 XML 形式数据
这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。
@Controller +@ResponseBody 返回 JSON 或 XML 形式数据
声明 Bean 的作用域
@Scope:声明 Spring Bean 的作用域,使用方法:
四种常见的 Spring Bean 的作用域:
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session : 每一个 HTTP Session 会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
声明配置类 Bean
@Configuration:一般用来声明配置类,可以使用 @Component 注解替代,
不过使用 @Configuration 注解声明配置类更加语义化。
不过使用 @Configuration 注解声明配置类更加语义化。
处理常见的 HTTP 请求类型
5 种常见的请求类型:
- GET :请求 从服务器获取特定资源。举个例子:GET /users(获取所有学生)
- POST :在服务器上 创建 一个新的资源。举个例子:POST /users(创建学生)
- PUT :更新 服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/2(更新编号为 2 的学生)
- DELETE :从服务器 删除 特定的资源。举个例子:DELETE /users/2(删除编号为 2 的学生)
- PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少。
GET 请求:@GetMapping("users") 等价于 @RequestMapping(value="/users",method=RequestMethod.GET)
POST 请求:@PostMapping("users") 等价于 @RequestMapping(value="/users",method=RequestMethod.POST)
PUT 请求:@PutMapping("/users/{userId}") 等价于 @RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
DELETE 请求:@DeleteMapping("/users/{userId}") 等价于 @RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
PATCH 请求:一般实际项目中,我们都是 PUT 不够用了之后才用 PATCH 请求去更新数据。
前后端传值
@PathVariable 和 @RequestParam
@PathVariable 用于获取 路径参数,@RequestParam 用于获取 查询参数。
举个简单的例子:
如果我们请求的 url 是:/klasses/123456/teachers?type=web
那么我们服务获取到的数据就是:klassId=123456,type=web。
那么我们服务获取到的数据就是:klassId=123456,type=web。
@RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且 Content-Type
为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用
HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。
为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用
HttpMessageConverter 或者自定义的 HttpMessageConverter 将请求的 body 中的 json 字符串转换为 java 对象。
我们有一个注册的接口:
UserRegisterRequest对象:
我们发送 post 请求到这个接口,并且 body 携带 JSON 数据:
这样我们的后端就可以直接把 json 格式的数据映射到我们的 UserRegisterRequest 类上。
👉 需要注意的是:一个请求方法只可以有一个 @RequestBody,但是可以有多个 @RequestParam 和 @PathVariable。
如果你的方法必须要用两个 @RequestBody 来接受数据的话,大概率是你的数据库设计或者系统设计出问题了!
如果你的方法必须要用两个 @RequestBody 来接受数据的话,大概率是你的数据库设计或者系统设计出问题了!
读取配置文件
很多时候我们需要将一些常用的配置信息比如阿里云 oss、发送短信、微信认证的相关配置信息等等放到配置文件中。
下面我们来看一下 Spring 为我们提供了哪些方式帮助我们从配置文件中读取这些配置信息。
编写一个 yaml 的配置文件:
1. 通过 @value 读取比较简单的配置信息
使用 @Value("${property}") 读取比较简单的配置信息:
需要注意的是 @value这种方式是不被推荐的,Spring 比较建议的是下面几种读取配置信息的方式。
2. 通过 @ConfigurationProperties 读取并与 bean 绑定
LibraryProperties 类上加了 @Component 注解,我们可以像使用普通 bean 一样将其注入到类中使用。
这个时候你就可以像使用普通 bean 一样,将其注入到类中使用:
控制台输出:
3. 通过 @ConfigurationProperties 读取并校验
我们先将 application.yml 修改为如下内容,明显看出这不是一个正确的 email 格式:
ProfileProperties 类没有加 @Component 注解:
我们在要使用 ProfileProperties 的地方使用 @EnableConfigurationProperties 注册我们的配置 bean:
因为邮箱格式不正确,所以程序运行的时候就报错,根本运行不起来,保证了数据类型的安全性:
我们把邮箱测试改为正确的之后再运行,控制台就能成功打印出读取到的信息:
4. @PropertySource 读取指定的 properties 文件
编写一个类,定义一些对象来存储配置:
只需要在使用的地方注入这个类,就可以直接调用 get 方法获取:
参数校验
简单介绍
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的
数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
JSR(Java Specification Requests) 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,
可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!
可以直接将这些注解加在我们 JavaBean 的属性上面,这样就可以在需要校验的时候进行校验了,非常方便!
校验的时候我们实际用的是 Hibernate Validator 框架。Hibernate Validator 是 Hibernate 团队最初的数据校验框架,
Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的参考实现,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)
的参考实现,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的参考实现。
Hibernate Validator 4.x 是 Bean Validation 1.0(JSR 303)的参考实现,Hibernate Validator 5.x 是 Bean Validation 1.1(JSR 349)
的参考实现,目前最新版的 Hibernate Validator 6.x 是 Bean Validation 2.0(JSR 380)的参考实现。
注:更新版本的 spring-boot-starter-web 依赖中不再有 hibernate-validator 包(如2.3.11.RELEASE),
需要自己引入 spring-boot-starter-validation 依赖。
需要自己引入 spring-boot-starter-validation 依赖。
需要注意的是: 所有的注解,推荐使用 JSR 注解,即 javax.validation.constraints,而不是 org.hibernate.validator.constraints
一些常用的字段验证的注解:
@NotEmpty
被注释的字符串的不能为 null 也不能为空@NotBlank
被注释的字符串非 null,并且必须包含一个非空白字符@Null
被注释的元素必须为 null@NotNull
被注释的元素必须不为 null@AssertTrue
被注释的元素必须为 true@AssertFalse
被注释的元素必须为 false@Pattern(regex=,flag=)
被注释的元素必须符合指定的正则表达式@Email
被注释的元素必须是 Email 格式。@Min(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value)
被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value)
被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max=, min=)
被注释的元素的大小必须在指定的范围内@Digits(integer, fraction)
被注释的元素必须是一个数字,其值必须在可接受的范围内@Past
被注释的元素必须是一个过去的日期@Future
被注释的元素必须是一个将来的日期- ......
验证请求体(RequestBody)
我们在需要验证的参数上加上了 @Valid 注解,如果验证失败,它将抛出 MethodArgumentNotValidException。
验证请求参数(Path Variables 和 Request Parameters):
- 一定一定不要忘记在类上加上 @Validated 注解了,这个参数可以告诉 Spring 去校验方法参数。
更多详细内容查看
全局处理 Controller 层异常
相关注解:
- @ControllerAdvice:注解定义全局异常处理类
- @ExceptionHandler:注解声明异常处理方法
如何使用呢?拿我们上面的参数校验这块来举例子。如果方法参数不对的话
就会抛出 MethodArgumentNotValidException,我们来处理这个异常。
就会抛出 MethodArgumentNotValidException,我们来处理这个异常。
更多关于 Spring Boot 异常处理的内容:
封装一个优雅的 Spring Boot 全局异常处理:
事务 @Transaction
在要开启事务的方法上使用 @Transactional 注解即可!
我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在 @Transactional 注解中如果 不配置 rollbackFor属性,
那么事务只会在 遇到 RuntimeException 的时候才会 回滚,加上 rollbackFor=Exception.class。可以让事务在 遇到非运行时异常时也回滚。
那么事务只会在 遇到 RuntimeException 的时候才会 回滚,加上 rollbackFor=Exception.class。可以让事务在 遇到非运行时异常时也回滚。
@Transactional 注解一般可以作用在类或者方法上:
- 作用于类:当把
@Transactional
注解放在类上时,表示所有该类的 public 方法都配置相同的事务属性信息。 - 作用于方法:当类配置了
@Transactional
,方法也配置了@Transactional
,方法的事务会覆盖类的事务配置信息。
详细讲解:
Json 数据处理
1. 过滤 json 数据
@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
@JsonIgnore 一般用于类的属性上,作用和上面的 @JsonIgnoreProperties 一样。
2. 格式化 json 数据
@JsonFormat 一般用来格式化 json 数据。
3. 扁平化对象
嵌套类:
未扁平化之前:
使用 @JsonUnwrapped 扁平对象之后:
测试相关
@ActiveProfiles 一般作用于测试类上, 用于声明生效的 Spring 配置文件。
- @Test声明一个方法为测试方法
- @Transactional 被声明的测试方法的数据会回滚,避免污染测试数据。
- @WithMockUser Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限。
0 条评论
下一页