提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 1.SpringBoot 配置启动注解
- @SpringBootApplication
- 2.Bean处理注解
- 2.1 依赖注入
- @AutoWired、@Qualifier、@Resource
- 2.2 类被 Spring 容器创建,管理 ioc
- @Component、@Service、@Controller、@Repository ==@RestController==
- @RestController
- 2.3 配置类 @Configuration、@Bean
- 2.4 @Scope
- 3.HTTP请求注解
- @RequestMapping、@GetMapping、@PostMapping
- 3.1 @RequestMapping
- 3.2 @GetMapping
- 3.3 @PostMapping
- 3.4 @DeleteMapping
- 4 前后端参数传递注解
- @RequestParam、@RequestBody、@PathVariable、@RequestHeader、@CookieValue
- 4.1 @RequestParam
- 4.2 @PathVariable
- 4.3 @RequestBody
- 4.4 @ @ResponseBody
- 4.5 @RequestHeader
- 4.6 @CookieValue
- 5.读取配置注解
- 5.1 @Value
- 5.2 @ConfigurationProperties
- 5.3 @PropertySource
- 5.4 @Import
- 5.5 @ImportResource导入xml配置文件
- 6.参数校验注解
- 6.1 参数解释
- 6.2 @Valid 、@Validated
- 7.统一异常处理注解
- 7.1 @ControllerAdvice
- 7.2 @ExceptionHandler
- 8.JPA数据持久化注解
- 8.1 @Entity 、@Table
- 8.2 @Id、@Column
- 8.3 @Transactional
- 9.JSON格式处理注解
- 9.1 @JsonIgnoreProperties、@JsonIgnore
- 9.1 @JsonFormat
- 9.4 @JsonUnwrapped
- 10. 测试处理注解
1.SpringBoot 配置启动注解
@SpringBootApplication
包含@Configuration、@EnableAutoConfiguration、@ComponentScan通常用在主类上;
相关注解 | 说明 |
---|---|
@ComponentScan | 用来自动扫描被这些注解标识的类,最终生成ioc容器里的bean,默认扫描范围是@ComponentScan注解所在配置类包及子包的类 |
@SpringBootConfiguration | 与@Configuration作用相同,都是用来声明当前类是一个配置类,这里表明是springboot主类使用的配置类 |
@EnableAutoConfiguration | 是springboot实现自动化配置的核心注解,通过这个注解把spring应用所需的bean注入容器中 |
Spring Boot–02–自动装配原理
2.Bean处理注解
2.1 依赖注入
@AutoWired、@Qualifier、@Resource
这3个注解都是基于注解方式进行自动装配,在容器里面将查找到的bean返回,一般@AutoWired用得最多,@Qualifier则需要配合@AutoWired使用,@Resource则是可以通过名字进行自动装配
注解 | 说明 |
---|---|
@AutoWired | @Autowired默认按类型装配,如果发现找到多个bean,则按照name方式比对,如果还有多个,则报出异常 |
@Qualifier | spring的注解,按名字注入 一般当出现两个及以上bean时,不知道要注入哪个,结合@AutoWired使用 |
@Resource | 默认按名称注入例如@Resource(name = “zhaozhao”)则根据name属性注入找不到则报错,若无name属性则根据属性名称注入,如果匹配不成功则按照类型匹配匹配不成功则报错。 |
SpringBoot注解–03–@Resource与@Autowired用法区别
2.2 类被 Spring 容器创建,管理 ioc
@Component、@Service、@Controller、@Repository @RestController
这几个注解放在一起是因为功能基本一样的,都是将类注入到spring容器中,只不过它们使用的场景不同,被@Component,@Service,@Controller,@Repository注解标注的类,这些类会被纳入进spring容器中管理。
注解 | 说明 |
---|---|
@Repository | 持久层(dao)注入spring容器 |
@Service | 业务逻辑层(server)注入spring容器 |
@Controller | 控制层(controller)注入spring容器 |
@Component | 普通pojo注入spring容器 |
@RestController
该注解是@Controller和@ResponseBody的结合体,一般用于类,作用等于在类上面添加了@ResponseBody和@Controller
- 区别在于标注后整个类所有方法将直接返回 JSON 数据,不再需要视图解析处理,目前前后端分离的项目后端都是直接用这个注解的;
2.3 配置类 @Configuration、@Bean
- @Configuration作用于类上面,表明这是一个配置类
- @Bean产生一个Bean对象加入Spring IOC容器
注意:@Configuration标注在类上,相当于把该类作为spring的xml配置文件中,作用为:配置spring容器(应用上下文)
注解 | 说明 |
---|---|
@Configuration | 作用于类上表示这是一个配置类,可理解为用spring的时候xml里面的< beans>标签 |
@Bean | 产生bean对象加入容器,作用于方法,可理解为用spring的时候xml里面的标签 |
2.4 @Scope
声明 Spring Bean 的作用域,作用于一共有以下几种:
-
singleton:唯一 bean 实例,Spring 中的 bean 默认都是单例的。
-
prototype:每次请求都会创建一个新的 bean 实例。
-
request:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
-
session:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
3.HTTP请求注解
@RequestMapping、@GetMapping、@PostMapping
这3个注解功能也是类似的,通过这3个注解来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,用在方法上,可以通过配置的url进行访问
注解 | 说明 |
---|---|
@RequestMapping | @RequestMapping(url),通过该注解就可以通过配置的url进行访问,方式可以是get或post请求,两种方式均可 |
@GetMapping | @GetMapping(url) ,功能类似的,只是这个限定了只能是Get请求 |
@PostMapping | @PostMapping(url),功能类似的,只是这个限定了只能是Post请求 |
3.1 @RequestMapping
- 发起get请求或者post请求都可以
3.2 @GetMapping
- 只能用get请求
3.3 @PostMapping
- 只能发起post请求
3.4 @DeleteMapping
DELETE 请求,从服务器删除特定的资源。
4 前后端参数传递注解
@RequestParam、@RequestBody、@PathVariable、@RequestHeader、@CookieValue
这3个注解放在一起主要是经常在控制层用来接收参数的
注解 | 说明 |
---|---|
@RequestParam | 获取查询参数。即url?name=这种形式 |
@PathVariable | 获取路径参数。即url/{id}这种形式。 |
@RequestBody | 获取Body的参数,一般用于post获取参数 |
@ResponseBody | 表示该方法的返回结果直接写入 HTTP response body 中,而不会被解析为跳转路径 |
@RequestHeader | 获取请求头的信息 |
@CookieValue | 获取Cookie的信息 |
4.1 @RequestParam
- @RequestParam主要用于接收url?后面的参数,get或post请求,只要后面的url?有参数都可以获取到对应的参数
- @RequestParam 用在方法的参数前面,常用于获取请求中表单类型的key=value格式的数据。
@RestController
@RequestMapping("/api")
public class MyController {@GetMapping("/hello")public String hello(@RequestParam("name") String name) {return "Hello, " + name + "!";}// ...
}
@RequestParam注解有几个比较重要的属性,required 表示是否必须,默认为 true,必须。defaultValue 可设置请求参数的默认值。value 为接收url的参数名(相当于key值)。
@GetMapping("/requestParam")@ResponseBodypublic Map<String, String> requestParam(UserDto userDto,//通过一个实体类来接收,字段名必须一致@RequestParam(value = "id", required = false) String userId,@RequestParam(value = "name", required = false) String userName,@RequestParam(value = "pageIndex", required = true, defaultValue = "1") String pageIndex,@RequestParam(value = "pageSize", required = true, defaultValue = "5") String pageSize) {Map<String, String> map = new HashMap<>();map.put("userDto",userDto.toString());map.put("id", userId);map.put("name", userName);map.put("pageIndex", pageIndex);map.put("pageSize", pageSize);return map;}
4.2 @PathVariable
- 该注解主要用于获取路径参数,像url/{id}/{name}这种形式的参数都可以,get获取post请求均可
@PostMapping("/pathVariable/{id}/{name}")@ResponseBodypublic Map<String, String> pathVariable(@PathVariable(name = "id") String userId,@PathVariable(name = "name") String userName) {Map<String, String> map = new HashMap<>();map.put("id", userId);map.put("name", userName);return map;}
4.3 @RequestBody
- 该注解用于获取请求体数据(body),get没有请求体,故而一般用于post请求
@PostMapping("/test01")@ResponseBodypublic UserDto test01(@RequestBody UserDto userDto) {return userDto;}@PostMapping("/test02")@ResponseBodypublic String test02(@RequestBody String str) {return str;}
4.4 @ @ResponseBody
- @ResponseBody可以作用在方法上或类上,表示该方法的返回结果直接写入 HTTP response body中,而不会被解析为跳转路径,即不会经过视图解析器,返回什么数据即在页面输入什么数据。
4.5 @RequestHeader
- 获取请求头的信息
@PostMapping("/requestHeader")@ResponseBodypublic String requestBody03(@RequestHeader(name = "Content-Type") String contentType){return contentType;}
4.6 @CookieValue
- 获取Cookie的信息
@GetMapping("/demo3")
public void demo3(@RequestHeader(name = "myHeader") String myHeader,@CookieValue(name = "myCookie") String myCookie) {System.out.println("myHeader=" + myHeader);System.out.println("myCookie=" + myCookie);
}
5.读取配置注解
注解 | 说明 |
---|---|
@Value | 用于获取bean的属性,一般用于读取配置文件的数据,作用在变量上 |
@ConfigurationProperties | 用于注入Bean属性,然后再通过当前Bean获取注入值,作用在类上 |
@PropertySource | 用于指定要读取的配置文件,可以和@Value或@ConfigurationProperties配合使用 |
注意:@PropertySource不支持yml文件读取。
5.1 @Value
这里用yml配置文件进行演示,propres配置文件也是同样的效果,
- 在application.yml配置文件里设置开发环境的的配置文件(dev),这样用@Value获取到的就是开发环境的配置文件的数据,切换成生产环境(pro)则获取到的是生产环境的数据
代码 这里使用pro环境
5.2 @ConfigurationProperties
- 该注解可以直接注入整个类的数据,作用于类
配置文件如下,这里使用pro环境
5.3 @PropertySource
- 注意:@PropertySource不支持yml文件读取。
配置文件如下:people.properties
测试
当然@PropertySource还可以和@Value配合使用,即一个一个注入值。
5.4 @Import
导入额外的配置信息
- 功能类似XML配置的,用来导入配置类,可以导入带有@Configuration注解的配置类或实现了ImportSelector/ImportBeanDefinitionRegistrar。
5.5 @ImportResource导入xml配置文件
6.参数校验注解
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)的参考实现。
需要注意的是从 Spring Boot 2.3开始,我们还需要显式地添加 spring-boot-starter-validation 依赖项,在此之前的 Spring Boot 版本是在 spring-boot-starter-web 依赖项中包含的不需要额外引入。
6.1 参数解释
6.2 @Valid 、@Validated
SpringBoot注解–05–注解@Valid
SpringBoot注解–06–注解@Validated
创建request实体类
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Max;
import javax.validation.constraints.NotBlank;@Data
@NoArgsConstructor
public class TestRequest {@NotBlank(message = "name不为空")private String name;@Length(max = 3,message = "address最大长度是3")private String address;@Max(value = 5,message = "reqNo最大值是5")private String reqNo;}
创建controller
@RestController
public class ValidTestController {@RequestMapping("/valid/test")public void test(@Valid @RequestBody TestRequest request){System.out.println(request);}
7.统一异常处理注解
异常处理通常也是我们在开发中一定要做的,因为不可能将一些程序员才能看懂的异常抛出到前端去(总会有不靠谱的同事忘记捕获异常的),所以一般都会加上统一的异常处理,在对用户不友好的错误堆栈转换为普通用户可以看懂的文案提示
7.1 @ControllerAdvice
- 定义全局异常处理类,包含 @Component 所以可以被 Spring 扫描到。
7.2 @ExceptionHandler
- 声明异常处理方法,表示遇到这个异常,就执行标注的方法。
8.JPA数据持久化注解
- 上面是百度百科给的概念,只能说在实际项目开发中还是用的不多,大家还是喜欢用 Mybatis,不过相比更加简洁的技术还是要学习下的。
8.1 @Entity 、@Table
- @Entity实体类注解
- @Table(name =“数据库表名”),这个注解也注释在实体类上,对应数据库中相应的表。
- @Id、@Column注解用于标注实体类中的字段,pk字段标注为@Id,其余@Column。
8.2 @Id、@Column
8.3 @Transactional
9.JSON格式处理注解
9.1 @JsonIgnoreProperties、@JsonIgnore
- @JsonIgnoreProperties 作用在类上用于过滤掉特定字段不返回或者不解析。
- @JsonIgnore一般用于类的属性上,作用和上面的@JsonIgnoreProperties 一样。
9.1 @JsonFormat
- @JsonFormat 格式化 json 数据
要注意的是,它只会在类似 @ResponseBody 返回 json 数据的时候,才会返回格式化的 yyyy-MM-dd HH:mm:ss 时间,你直接使用System.out.println()输出的话,仍然是类似 Fri Dec 01 21:05:20 CST 2017 这样的时间样式。
@Data
@Accessors(chain = true)
public class DateRangeVO {/*** 开始时间*/@JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN,timezone ="GMT+8")private LocalDateTime startTime;/*** 结束时间*/@JsonFormat(pattern = DateUtils.DATE_TIME_PATTERN,timezone ="GMT+8")private LocalDateTime endTime;/*** 开始时间,毫秒时间戳 主要用于es查询*/private Long startTimeMillion;/*** 结束时间,毫秒时间戳 主要用于es查询*/private Long endTimeMillion;/*** 开始时间,秒时间戳 主要用于ada相关数据查询*/private Long startTimeEpochSecond;/*** 结束时间,秒时间戳 主要用于ada相关数据查询*/private Long endTimeEpochSecond;}
9.4 @JsonUnwrapped
扁平化对象
未扁平化之前:
使用 @JsonUnwrapped 扁平对象之后:
10. 测试处理注解
-
@ActiveProfiles一般作用于测试类上, 用于声明生效的 Spring 配置文件。
-
@Test声明一个方法为测试方法。
-
@Transactional被声明的测试方法执行后数据会被回滚,避免污染测试数据。
-
@WithMockUser Spring Security 提供的,用来模拟一个真实用户,并且可以赋予权限。