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