Spring/Spring Boot常用注解总结

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;
}

友好提示:
部分文章内容借鉴于:https://juejin.im/post/5ea2593f6fb9a03c73799bf4

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值