最近准备换工作,与此同时整理下知识点顺便回忆下当初学习的注解知识点;整理的都是比较常用的注解,可能有些解释的不是很标准,也请帮忙补重下。
@RestController:需要加载spring-boot-starter-web;一般是使用在类上的,它表示的意思其实就是结合了 @Controller和@ResponseBody两个注解, 如果哪个类下的所有方法需要返回json数据格式的,就在哪个类上使用该注解,具有统一性; 需要注意的是,使用了@RestController注解之后,其本质相当于在该类的所有方法上都统一使用了@ResponseBody注解, 所以该类下的所有方法都会返回json数据格式,输出在页面上,而不会再返回视图;如果返回的是视图只用@Controller。
@ResponseBody,一般是使用在单独的方法上的,需要哪个方法返回json数据格式,就在哪个方法上使用,具有针对性。
@RequestParam,用于将请求参数区数据映射到功能处理方法的参数上。注解本质上相当于通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String–> 简单类型的转换操作由ConversionService配置的转换器来完成);详细参数:
value | 参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入; |
---|---|
required | 是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码; |
defaultValue | 默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式。 |
@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中。可用value属性指定名字,service层使用@Resource(name=“userDao”)调用spring容器中的userDao对象。
@Mapper(mybatis專用)不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。
@RequestMapping 处理请求地址映射;詳細參數
value | 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明); |
---|---|
method | 指定请求的method类型, GET、POST、PUT、DELETE等; |
consumes | 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html; |
produces | 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回; |
params | 指定request中必须包含某些参数值是,才让该方法处理; |
headers | 指定request中必须包含某些指定的header值,才能让该方法处理请求。 |
@ModelAttribute
ModelAttribute注解的源代码分析流程
/**
* 1. 有 @ModelAttribute 标记的方法, 会在每个目标方法执行之前被 SpringMVC 调用!
* 2. @ModelAttribute 注解也可以来修饰目标方法 POJO 类型的入参, 其 value 属性值有如下的作用:
* 1). SpringMVC 会使用 value 属性值在 implicitModel 中查找对应的对象, 若存在则会直接传入到目标方法的入参中.
* 2). SpringMVC 会以 value 为 key, POJO 类型的对象为 value, 存入到 request 中.
*/
具有如下三个作用:
- 绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用;
- 暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
- 暴露@RequestMapping方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
@Valid注解用于校验
你可以定义实体,在实体的属性上添加校验规则,在API接收数据时添加@Valid注解限制;
@SuppressWarnings("unchecked")
@PostMapping(value = "/save")
@ResponseBody
@ApiOperation(value = "新增用戶")
public Result saveUser(@RequestBody String value, @RequestParam(value = "name") String name,
@RequestParam(value = "password") String password, @RequestParam(value = "email") String email,
@Valid @ModelAttribute User user,BindingResult bindingResult) {
if(bindingResult.hasErrors()){
System.out.println(bindingResult.getFieldError().getDefaultMessage());
return null;
}
return new Result(HttpStatus.SC_OK,"success",true,user.toString());
}
说明
@Null 限制只能为null
@NotNull 限制必须不为null
@AssertFalse 限制必须为false
@AssertTrue 限制必须为true
@DecimalMax(value) 限制必须为一个不大于指定值的数字
@DecimalMin(value) 限制必须为一个不小于指定值的数字
@Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@Future 限制必须是一个将来的日期
@Max(value) 限制必须为一个不大于指定值的数字
@Min(value) 限制必须为一个不小于指定值的数字
@Past 限制必须是一个过去的日期
@Pattern(value) 限制必须符合指定的正则表达式
@Size(max,min) 限制字符长度必须在min到max之间
@Past 验证注解的元素值(日期类型)比当前时间早
@NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
@Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
package com.example.entity;
import java.io.Serializable;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class User implements Serializable{
private static final long serialVersionUID = 1L;
private Integer uid;
@NotBlank(message="用戶名不能為空")
private String name;
@NotBlank(message="密碼不能為空")
private String password;
private String screenName;
private Integer age;
private String sex;
@Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
private String phone;
@Email(message="郵箱格式錯誤")
private String email;
private String createdTime;
private String loggTime;
private String groupName;
}
Spring验证的错误返回 ·····> BindingResult
@Valid 和 BindingResult 是一一对应的,如果有多个@Valid,那么每个@Valid后面跟着的BindingResult就是这个@Valid的验证结果,顺序不能乱
@PathVariable绑定URI模板变量值(绑定占位符参数到方法参数中)
@RequestMapping(value="/users/{userId}/topics/{topicId}")
public String test(@PathVariable(value="userId") int userId,
@PathVariable(value="topicId") int topicId) {
User user = userLoginService.userLogin(userId,topicId);
if(user != null){ //登录成功
request.getSession().setAttribute("session_user",user); //将用户信息放入session
return "index";
}
return "loginError";
}
@Autowired
顾名思义,就是自动装配。其作用是替代Java代码里面的getter/setter与bean属性中的property。如果私有属性需要对外提供的话,getter应当予以保留。
@Resource
J2EE提供的一种装配注解,默认通过name属性去匹配bean,找不到再按type去匹配;如果指定了name或者type,则按照指定的去匹配bean;如果同时指定name和type,者要同时满足,一个不匹配就会报错
@Autowired和@Resource两个注解的区别:
1、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
2、@Autowired是Spring的注解,@Resource是J2EE的注解,根据导入注解的的包名就可以知晓