文章目录
- 1. 核心注解
- 1.1 @SpringBootApplication
- 2. Spring中Bean的相关注解
- 2.1. @Autowired
- 2.2. @Component,@Repository,@Service, @Controller等等
- 2.3. @RestController
- 2.4. @Scope
- 2.5. @Configuration
- 3. 处理常见的 HTTP 请求类型
- 4. 前后端传值
- 4.1. @PathVariable 和 @RequestParam
- 4.2. @RequestBody
- 5. 读取配置信息
- 5.1. @value(常用)
- 5.2. @ConfigurationProperties(常用)
- 5.3. PropertySource(不常用)
- 6. 参数校验
- 6.1. 一些常用的字段验证的注解
- 6.2. 验证请求体(配合@Valid注解)
- 7. 全局处理 Controller 层异常
- 8. json 数据处理
- 8.1. 过滤 json 数据
- 8.2. 格式化 json 数据
1. 核心注解
1.1 @SpringBootApplication
这个注解是 Spring Boot 项目的基石,创建 SpringBoot 项目之后会默认在主类加上。
@SpringBootApplication
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
}
通过源码可得知,@SpringBootApplication整合了@Configuration、@EnableAutoConfiguration、@ComponentScan 注解。
package org.springframework.boot.autoconfigure;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
// 注解作用:启用 SpringBoot 的自动配置机制
@EnableAutoConfiguration
// 注解作用:扫描被@Component、@Service、@Controller注解的 bean,注解默认会扫描该类所在的包下所有的类。
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// 此处省略方法。
}
/*------------@SpringBootConfiguration注解源码---------------------------*/
package org.springframework.boot;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 注解作用:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
@Configuration
public @interface SpringBootConfiguration {
}
2. Spring中Bean的相关注解
2.1. @Autowired
自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。
示例:
import org.springframework.stereotype.Service;
@Service
public class OrderService {
}
/*-------------------------------*/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class OrderController {
@Autowired
private OrderService orderService;
}
2.2. @Component,@Repository,@Service, @Controller等等
我们一般使用 @Autowired 注解让 Spring 容器帮我们自动装配 bean。要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,可以采用以下注解实现:
- @Component :通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。
- @Repository : 对应持久层即 Dao 层,主要用于数据库相关操作。
- @Service : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao 层。
- @Controller : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。
2.3. @RestController
@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。
单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller +@ResponseBody 返回 JSON 或 XML 形式数据。
2.4. @Scope
声明 Spring Bean 的作用域
示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import java.util.Date;
public class BeanDemo {
@Bean
@Scope("singleton")
public Date now() {
return new Date();
}
}
四种常见的 Spring Bean 的作用域:
- singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
- prototype : 每次请求都会创建一个新的 bean 实例。
- request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
- session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
2.5. @Configuration
声明Bean的一种注解,和@Component作用都一样的,如果是一些配置的话,使用该注解声明会更加语义化。
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanDemo {
}
3. 处理常见的 HTTP 请求类型
5 种常见的请求类型:
- GET :请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
- POST :在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
- PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)
- DELETE :从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)
- PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。
@RestController
public class BeanDemo {
@GetMapping("/get")
public String get() {
return "get";
}
@PostMapping("/post")
public String post() {
return "post";
}
@PutMapping("/put")
public String put() {
return "put";
}
@DeleteMapping("/delete")
public String delete() {
return "delete";
}
@PatchMapping("/patch")
public String patch() {
return "patch";
}
}
4. 前后端传值
4.1. @PathVariable 和 @RequestParam
@PathVariable用于获取路径参数,@RequestParam用于获取查询参数。
@GetMapping("/user/{userId}")
public String get(@PathVariable Integer userId, @RequestParam(value = "type", required = false) Integer type) {
return "get";
}
请求路径就是:如果我们请求的 url 是:www.test.com/user/1000?type=1
那么我们服务获取到的数据就是:userId=123456,type=1。
4.2. @RequestBody
用于读取 Request 请求(可能是 POST,PUT,DELETE,GET 请求)的 body 部分并且Content-Type 为 application/json 格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。系统会使用HttpMessageConverter或者自定义的HttpMessageConverter将请求的 body 中的 json 字符串转换为 java 对象。
// 接口
@PostMapping("/add-user")
public String get(@RequestBody AddUserDTO dto) {
return "success";
}
// 参数实体
@Data
public class AddUserDTO {
// 手机号
private String phone;
// 密码
private String password;
}
发送 post 请求到这个接口,并且 body 携带 JSON 数据:
{
“phone”: “13777777777”,
“password”: “123456”
}
5. 读取配置信息
yml方式:
demo:
username: 张三
password: 123
properties方式:
demo.username=张三
demo.password=123
5.1. @value(常用)
@Value("${demo.username}")
private String username;
@Value("${demo.password}")
private String password;
5.2. @ConfigurationProperties(常用)
@Data
@Component
@ConfigurationProperties(prefix = "demo")
public class DemoProperties {
private String username;
private String password;
}
5.3. PropertySource(不常用)
@Data
@Component
@PropertySource("classpath:application.properties")
public class DemoProperties {
@Value("${demo.username}")
private String username;
@Value("${demo.password}")
private String password;
}
6. 参数校验
数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据。
JSR(Java Specification Requests) 是一套 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)的参考实现。
SpringBoot 项目的 spring-boot-starter-web 依赖中已经有 hibernate-validator 包,不需要引用相关依赖。如下图所示(通过 idea 插件—Maven Helper 生成):
注意: 所有的注解,推荐使用 JSR 注解,即javax.validation.constraints,而不是org.hibernate.validator.constraints
6.1. 一些常用的字段验证的注解
- @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 被注释的元素必须是一个将来的日期…
6.2. 验证请求体(配合@Valid注解)
@Data
public class JSRDemo {
@NotBlank(message = "用户名不能为空!")
private String username;
@NotBlank(message = "密码不能为空!")
private String password;
}
// 我们在需要验证的参数上加上了@Valid注解,如果验证失败,它将抛出MethodArgumentNotValidException。
@GetMapping("/jsr")
publicString jsrDemo(@Valid JSRDemo demo) {
return "success";
}
7. 全局处理 Controller 层异常
介绍一下我们 Spring 项目必备的全局处理 Controller 层异常。
相关注解:
1、@ControllerAdvice :注解定义全局异常处理类
2、@ExceptionHandler :注解声明异常处理方法
如何使用呢?拿我们在第 6 节参数校验这块来举例子。如果方法参数不对的话就会抛出MethodArgumentNotValidException,我们来处理这个异常。
@ResponseBody
@ControllerAdvice
// 如果使用 @RestControllerAdvice 注解,可代替以上两个
// @RestControllerAdvice 注解相当于 @ControllerAdvice + @ResponseBody
// @RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 请求参数异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletRequest request) {
.......
}
}
8. json 数据处理
8.1. 过滤 json 数据
@JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
@Data
// 生成json时将 roles 属性过滤
@JsonIgnoreProperties({"roles"})
public class UserInfoVO {
private String username;
private String password;
private List<String> roles;
}
@JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。
@Data
public class UserInfoVO {
private String username;
private String password;
// // 生成json时将 roles 属性过滤
@JsonIgnore
private List<String> roles;
}
8.2. 格式化 json 数据
@Data
@JsonIgnoreProperties({"roles"})
public class UserInfoVO {
private String username;
private String password;
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
private Date createTime;
}
友好提示:
部分文章内容借鉴于: