Spring框架
Spring框架的作用
Spring 框架主要解决了创建对象,管理对象的问题
Spring 框架的依赖项
当项目中需要使用Spring框架时,需要添加依赖项是: spring-context
Spring 框架创建对象的做法
Spring框架创建对象有2中做法:
- 在任何配置类(添加了
@Configuration
)中,自定义方法,返回某种类型(你需要的)对象,并在方法上添加@Bean注解- 此方法创建出来的对象,在Spring容器中名称就是方法名称.
- 此方法应该是public
- 此方法的返回值类型,是你期望Spring框架处理的类型
- 此方法的参数列表,应该为空
- 此方法的方法体,应该是自行设计的,没有要求
- 配置组件扫描,并在组件类上添加组件注解
- 此方式创建出来的对象,在Spring容器中的名称默认是将类名首字母改为小写
- 例如:类名是
AdminController
,则对象在Spring容器中的名称为adminController
- 此规则仅适用于类名的第1个字母大写,且第2个字母小写的情况,如果不符合此规则,则对象在Spring容器中的名称就是类名
- 可以通过组件注解的参数来指定名称.
- 例如:类名是
- 在任何配置类上,添加
@ComponentScan
,当加载此配置类时们就会激活组件扫描 - 可以配置
@ComponentScan
的参数,此参数应该是需要被扫描的根包(会扫描所配置的包,及其所有子孙包),且此注解参数的值是数组类型.@CompontenScan("cn.tedu")
- 此方式创建出来的对象,在Spring容器中的名称默认是将类名首字母改为小写
- 如果没有配置@ComponentScan的参数中的根包,则组件扫描的范围就是当前类的根包,及其子孙包.
- 需要在个组件类上添加组件注解才会被创建对象.常见的主键注解有
@Component
: 通用注解@Controller
:控制器类注解
1.@RestController:
仅添加在Spring MVC框架以后才可以使用
2.@ControllerAdvice:
仅添加在Spring MVC框架以后才可以使用
3.@RestControllerAdvice
:仅添加在Spring MVC框架以后才可以使用@Service
:保证数据的完整性,安全性,和有效性,设计业务流程和业务逻辑规则,是Serviect这种业务注解@Repository
:处理数据源中的数据读写的类的注解
- 以上四种组件注解在Spring框架作用范围之内是完全等效的.但是用的时候我们还是要有章法,分开来用.
Configuration
也是一个组件注解,但是和上面四个是不一样的.Spring对次注解的处理更加的特殊(Spring 框架对配置类使用了代理模式.)
对于这两种创建对象的做法,通常
- 如果是自定义的类,优先使用组件扫描的做法来创建对象
- 如果不是自定义类,无法使用组件扫描的做法,只能在配置类中通过@Bean方法来创建对象
当Spring成功创建了对象后,会将对象保存在Spring应用程序上下文中,后续,当需要这些对象时,可以从Spring上下文中获取.
由于Spring应用程序上下文对象中持有大量对象的引用,所以:Spring应用程序上下文也通常称之为Spring 容器
Spring 框架管理的对象的作用域
默认情况下,Spring框架管理的对象都是单例的
单列 :在任何时间点,某个类的对象最多只有1个
可以在类上添加@Scope(“protorype”)使得被Spring管理的对象时"非单列的".
@Scope注解还可以配置为
@Scope("singleton")
,此singleton表示“单例的”,是默认的。
默认情况下,Spring框架管理框架单例是"预加载的",相当于设计模式中的单例模式的"恶汉式单列模式"
提示可以在类上添加
@Lazy
注解,使得此读写是"懒加载的",相当于"懒汉式单列模式",只会在第1次需要获取对象时才把对象创建出来!
注意 Spring框架并不是是用来设计模式中的"单例模式",只是从对象管理方面,对象的作用域表现域单例模式极为相似而已.
Admin admin=new Admin();
admin.setUsername("root")
自动装配
自动装配的定义:当某个量需要值时,Spring框架会自动从Spring容器中找到合适的值,为这个量赋值.
自动装配的典型表现是在某个类中添加@Autowired
注解,例如
@RestController
public class AlbumController {
// ↓↓↓↓↓↓↓↓↓自动装配的典型表现↓↓↓↓↓↓↓↓↓↓↓
@Autowired
private IAlbumService albumService;
或者:
@RestController
public class AlbumController {
private IAlbumService albumService;
// ↓↓↓↓↓↓↓↓↓自动装配↓↓↓↓↓↓↓↓↓↓↓
public AlbumController(IAlbumService albumService){
this.albumService=albumService;
}
Spring创建对象时候,需要调用构造方法,如果类中仅有一个构造方法,Spring会自动调用,(如上所示),如果这个唯一的构造方法是有参数的,Spring也会自动从容器中找到合适的对象来调用此构造方法,如果容器没有合适的对象,则无法创建,!如果类中有多个构造方法,默认情况下,Spring会自动调用添加了
@Autowired
注解的构造方法,如果多个构造方法都没有添加此注解,则Spring会自动调用无参的构造方法,如果也不存在无参构造,则会报错.
或者:
@RestController
public class AlbumController {
private IAlbumService albumService;
@Autowired
// ↓↓↓↓↓↓↓↓↓自动装配↓↓↓↓↓↓↓↓↓↓↓
public void setAlbumService(IAlbumService albumService){
this.albumService=albumService;
}
另外在配置类中的@Bean
方法也是可以在需要的时候自行添加参数,如果Spring容器中有合适的值,Spring也会从容器中找到值来调用对象.
关于合适的值,Spring对于@Autowired
的处理机制是:查找在Spring容器中匹配类型的对象的数量:
- 1个:直接装配,且装配成功
- 0个:取决于
@Autowired
注解的required
属性- true(默认值):装配失败,加载时报错(即启动项目)
- false:放弃装配,则此量的值为null,在接下来的使用过程中可能导致NPE
NullPointerException
- 超过1个:取决于是否存在某个Spring Bean(Spring容器中的对象)的名称与当前量的名称匹配
- 存在:成功装配
- 不存在:转配失败,加载时报错(即启动项目的时候报错)
关于通过名称匹配失败的问题
- 默认情况下,要求量(全局变量,方法参数等)的名称与对象在Spring容器中名称完全相同,可视为完全匹配.
- 可以在量的声明之前添加
@Qualifier
注解,通过此注解参数来指定名称,以匹配某个Spring容器的对象.@Qualifier
注解是用于配合自动转配机制的,单独使用没有意义.
其实还可以使用@Resource
注解来实现自动装配,但是不推荐
Spring框架对@Resource
注解的自动装配机制是:先根据名称再根据类型来实现自动装配,与@Autowired
完全相反.
为什么不推荐用@Resource
是javax这个包(官方的)中的注解(儿子),但是@Autowired
是Spring的亲儿子,为什么我们明明有官方的亲儿子,Spring还要创建一个呢?@Resource
存在一定的不足,,此注解只能添加在类上、属性上、方法上,不可以添加在构造方法上、方法的参数上。
关于IoC与DI
**IoC: ** inversion of Control,控制反转,即将对象的创建,管理的权利(控制能力)交个框架
ID: Dependency Injection ,依赖注入,即为依赖项注入值(例如,controller中有Service,其实就是依赖 而我们的Service有值了那么就是注入.说白了就是赋值,但是没有等号,我们就叫注入,)
Spring框架通过DI,现实完善了Ioc
关于Spring AOP
AOP:面向切面的编程
** 注意:** AOP并不是Spring框架特有的技术,只是Spring框架很好地支持了AOP
AOP:主要用于:日志,安全,事务管理,自定义业务规则(但是我们现在都用来框架来解决这些,但是这些框架底层用了AOP,所有我们写代码后就没有用什么AOP).
在项目中,数据的处理流程大致是:
添加品牌:请求--------->Controller -------->Service -------->Mapper ------->DB
<--------- <--------- <--------- <---------
添加类别:请求--------->Controller -------->Service -------->Mapper ------->DB
<--------- <--------- <--------- <---------
删除品牌:请求--------->Controller -------->Service -------->Mapper ------->DB
<--------- <--------- <--------- <---------
其实,各个请求提交到服务器端后,数据的处理流程是相对固定的!
假设存在某个需求,无论是添加[]品牌,添加类别,删除品牌,或者其他请求的处理,都需要在Service组件中执行相同的任务,应该如何处理?
例如,假设需要实现一个功能,“统计所有Service中的业务方法的执行耗时”,首先,需要添加依赖
<!-- Spring Boot AOP的依赖项 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
则可以在根包下创建一个aop.TimerAspect
;类,作为切面类,必须添加@Aspect
注解,由于是通过Spring来管理,它应该交由Spring管理,它应该是个组件类,则再补充上@Component
注解,并在类中自定义方法,且通过注解来配置方法何时执行:
package cn.tedu.csmall.product.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Slf4j
@Aspect
@Component
public class TimerAspect {
public TimerAspect() {
log.debug("创建切面对象:TimerAspect");
}
// 【AOP的核心概念】
// 连接点(JoinPoint):数据处理过程中的某个时间节点,可能是调用了方法,或抛出了异常
// 切入点(PointCut):选择一个或多个连接点的表达式
// 通知(Advice):在选择到的连接点执行的代码
// 切面(Aspect):是包含了切入点和通知的模块
// ----------------------------------------------------------
// 【通知注解】
// @Before注解:表示“在……之前”,且方法应该是无参数的
// @After注解:表示“在……之后”,无论是否抛出异常,或是否返回结果,都会执行,且方法应该是无参数的
// @AfterReturning注解:表示“在返回结果之后”,且方法的参数是JoinPoint和返回值
// @AfterThrowing注解:表示“在抛出异常之后”,且方法的参数是JoinPoint和异常对象
// @Around注解:表示“包裹”,通常也称之为“环绕”,且方法的参数是ProceedingJoinPoint
// ----------------------------------------------------------
// @Around开始
// try {
// @Before
// 表达式匹配的方法
// @AfterReturning
// } catch (Throwable e) {
// @AfterThrowing
// } finally {
// @After
// }
// @Around结束
// ----------------------------------------------------------
// 注解中的execution内部配置表达式,以匹配上需要哪里执行切面代码
// 表达式中,星号(*)是通配符,可匹配1次任意内容
// 表达式中,2个连接的小数点(..)也是通配符,可匹配0~n次,只能用于包名和参数列表
@Around("execution(* cn.tedu.csmall.product.service.*.*(..))")
// ↑ 此星号表示需要匹配的方法的返回值类型
// ↑ ---------- 根包 ----------- ↑
// ↑ 类名
// ↑ 方法名
// ↑↑ 参数列表
public Object timer(ProceedingJoinPoint pjp) throws Throwable {
log.debug("执行了TimeAspect中的方法……");
log.debug("【{}】类型的对象调用了【{}】方法,参数值为【{}】",
pjp.getTarget().getClass().getName(),
pjp.getSignature().getName(),
pjp.getArgs());
long start = System.currentTimeMillis();
// 注意:必须获取调用此方法的返回值,作为当前切面方法的返回值
// 注意:必须抛出调用此方法的异常,不可以使用try...catch捕获并处理
Object result = pjp.proceed(); // 相当于执行了匹配的方法,即业务方法
long end = System.currentTimeMillis();
log.debug("执行耗时:{}毫秒", end - start);
return result;
}
}
【AOP的核心概念】
- 连接点(JoinPoint):数据处理过程中的某个时间节点,可能是调用了方法,或抛出了异常
- 切入点(PointCut):选择一个或多个连接点的表达式(注解里面的选择表达式)
- 通知(Advice):在选择到的连接点执行的代码(就是上面的注解)
- 切面(Aspect):是包含了切入点和通知的模块
Spring MVC框架
Spring MVC框架的作用
Spring MVC 框架主要解决了接收请求,响应结果的相关问题
Spring MVC框架的依赖项
当项目中使用Spring MVC框架时,需要添加的依赖项是:spring-webmvc
配置请求路径
通过@RequestMapping
系列注解可以配置请求路径
限制请求方式
通过@RequestMapping
注解的method
属性限制请求方法,如
@RequestMapping(value="/login",method=RequestMetho.POST)
或者直接使用衍生的注解,例如@GetMapping
,@PostMapping
接受请求参数
可以在处理请求的方法的参数列表中自由设计请求参数,可以:
- 将各个请求参数逐一列举出来,表现为方法的多个参数,例如:
public JsonResult<Void> login(String username,String password){...}
- 将各个请求参数封装到自定义类型中,使用自定义类型作为方法参数
关于请求参数注解 @RequestParam
:此注解可以用于:**1.**修改请求参数的名称(没有太多的实用价值),2强制要求必须提交这个参数,(可以通过Validation框架的@NotNull
实现同样的效果)所有也没有太多价值,3:设置请求参数的默认值,(适用于允许客户端)提交此请求参数时)@PathVariable
:当URL中设计了占位符参数时,必须在对应的方法参数上添加此注解,以表示参数的值来自URL中的占位符位置的值,如果占位符中的名称与方法参数名称不匹配,可以通过此注解的参数来配置
@RequestBody
:当方法的参数添加了此注解时,客户端提交的请求参数必须是对象格式的,当方法的参数没有添加此注解时,客户端提交的请求参数必须是FormData格式.
响应结果
- 默认情况下,处理请求的方法的返回值将表示"处理响应结果的视图组件的名称,及相关的数据".在Spring MVC中,有一种内置的返回值类型是Model AndView,不是前后端分离的做法,
- 在处理请求的方法上可以添加一个
@ResponseBody
注解,当添加此注解后,处理请求的方法的返回值将表示"响应的数据,"不再由服务器端决定视图组件,这种做法也叫做响应正文! 这是前后端分离的做法. @ResponseBody
注解可以添加在处理请求的方法上,将作用于当前方法,也可以添加在控制器类上,将作用于控制器类中所有处理请求的方法.!- 控制器类需要添加
@Controller
注解,才是控制器类,或者,也可以改为添加@RestController
,此注解是由@Controller
和@ResponseBody
组合而成的,所以,添加@RESTController
后,当前控制器类中多有处理请求的方法都是响应正文的.
当控制器类处理请求需要响应正文时,Spring MVC框架会根据处理请求的方法的放回值类型,来决定使用某个MessageConverter(消息转换器),来将返回值转换为响应到客户端的数据,不同的返回值类型对应不同的消息转换器,例如
,返回值是String时,Spring MVC将使用stringHttpMessageConverter,如果某个返回值类型是Spring MVC框架默认不识别的没有对应的消息转换器,且当前项目添加了jackson-databind
依赖项后,会自动使用此依赖项中的消息转换器,而jackaon-databind
中的消息转换器会将返回的结果转换为JSON格式的字符串.!==所有我们的项目为什么能响应JSON类型的数据,1,是因为我们的类型框架自动不识别,2,是因为我们添加了此框架.==另外,如果此项目是使用XML来配置的SpringMVC框架的,还需要添加<annotation-driiven/>
以开启注解驱动,如果是使用注解进行配置的,则需要在配置类添加@RnableWebMVC
注解,如果在SpringBoot应用SpringMVC,不需要进行配置.
.
关于处理异常
添加了 @ExceptionHandler
注解的方法,就是处理异常的方法
- 处理异常的方法到底处理哪种异常.由
@ExceptionHandler
注解参数或方法的参数中的异常类型来决定,如果@ExceptionHandler
注解没有配置参数,由方法参数中的异常类型决定,如果@ExceptionHandler
注解配置了参数,由注解参数中配置的类型为准. - 处理异常的方法可以声明在控制器类,将只作用于当前控制器类中的方法抛出的异常
- 通常,建议将处理异常的方法声明在专门的类中,并在此类上添加
@ControllerAdvice
注解,当添加此注解后,此类中特定的方法(例如处理异常的方法)将作用于每次处理请求的过程中!如果处理异常后的将"响应正文",也可以在处理异常的方法上添加@ResponseBody
注解,或在当前类上添加@ResponseBody
,或使用@RestControllerAdvice
取代@ControllerAdvice
和@ResponseBody
注解.
- 通常,建议将处理异常的方法声明在专门的类中,并在此类上添加
Spring MVC核心处理
Spring Boot框架
Spring Boot框架的作用
Spring Boot 框架主要解决了统一管理依赖项与简化配置相关的问题
统一管理依赖项:在开发实践中,项目中需要用到的依赖项可能较多,在没有SpringBoot之前,可能徐需要自行添加若干个依赖项,并且,需要自行保证这些依赖项的版本不会发生冲突,或保证不存在不兼容的问题.Spring Boot提供了starter
依赖项(就是依赖项的名称中都有starter
作为关键字),这种依赖项包含了使用某个框架时可能涉及的一系列依赖项,并处理好了各种依赖项的版本相关问题,保证依赖项的版本兼容,不冲突!例如spring-boot-starter-web
就包含了Spring MVC的依赖项(Spring-webmvc
),jackson-databind
,tomcat
等
简化配置 Spring Boot默认各个项目中最可预测的配置,它是一种约定大于配置的思想.当然这些配置也都是可以修改的,例如通过在application.properties
中添加指定属性名的配置.
Spring 框架的依赖项
当项目中使用Spring Boot 框架时,需要添加的基础依赖项是:spring-boot-starter
.此基础依赖项被其他各自带有starter
字样的依赖项所包含,所以,通常是不必显示的添加此基础依赖项.
典型的应用技巧
关于日志
在spring-boot-starter
中已经包含spring-boot-starter-logging
,所以,在添加任何starter依赖后,在项目中均可使用日志.
关于配置文件
- Spring Boot项目默认在
src/main/.resources
下已经准备好了配置文件,且Spring Boot默认识别的配置文件的文件名是application
,其扩展名为.properties
或.yml
- 此配置文件会被Spring Boot自动读取,框架指定属性名称的个配置值会被自动应用,自定义的配置需要通过
Environment
对象或通过@Value
注解自行读取并应用,所有不是指定属性名称的配置都是自定义配置. - 其实,读取
.properties
配置文件是Spring框架能做到的功能,而.ym
配置是Spring 框架并不支持的,但是在Spring Boot中,添加了解析.yml
文件的依赖项,所以,在Spring Boot 中既可以使用.properties
也可以使用.yml
. - 另外,Spring Boot 还很好的支持了Profile配置(也是Spring框架做到的功能)
注解
注解 | 所属框架 | 添加位置和作用 |
---|---|---|
@ComponentScan | Spring | 添加在配置类上,开启组件扫描。 如果没有配置包名,则扫描当前配置类所在的包, 如果配置了包名,则扫描所配置的包及其子孙包 |
@Component | Spring | 添加在类上,标记当前类是组件类,可以通过参数配置Spring Bean名称 |
@Controller | Sprign | 添加在类上,标记当前类是控制器组件类,用法同@Component |
@Service | Spring | 添加在类上,标记当前类是业务逻辑组件类,用法同@Component |
@Repository | Spring | 添加在类上,标记当前类是数据访问组件类,用法同@Component |
@Configuration | Spring | 添加在类上,仅添加此注解的类才被视为配置类,通常不配置注解参数 |
@Bean | Spring | 添加在方法上,标记此方法将返回某个类型的对象, 且Spring会自动调用此方法,并将对象保存在Spring容器中 |
@Autowired | Spring | 添加在属性上,使得Spring自动装配此属性的值 添加在构造方法上,使得Spring自动调用此构造方法 添加在Setter方法上,使得Spring自动调用此方法 |
@Qualifier | Spring | 添加在属性上,或添加在方法的参数上, 配合自动装配机制,用于指定需要装配的Spring Bean的名称 |
@Scope | Spring | 添加在组件类上,或添加在已经添加了@Bean注解的方法上, 用于指定作用域,注解参数为singleton(默认)时为“单例” 注解参数为prototype时为“非单例” |
@Lazy | Spring | 添加在组件类上,或添加在已经添加了@Bean 注解的方法上,用于指定作用域,当Spring Bean是单例时, 注解参数为true(默认)时为“懒加载”,注解参数为false时为“预加载” |
@Value | Spring | 添加在属性上,或添加在被Spring调用的方法的参数上,用于读取Environment 中的属性值,为对象的属性或方法的参数注入值 |
@Resource | Spring | 此注解是javax包中的注解, 添加在属性上,使得Spring自动装配此属性的值, 通常不推荐使用此注解 |
@ResponseBody | Spring MVC | 添加在方法上,标记此方法是“响应正文”的, 添加在类上,标记此类中所有方法都是“响应正文”的 |
@RestController | Spring MVC | 添加在类上,标记此类是一个“响应正文”的控制器类 |
@RequestMapping | Spring MVC | 添加在类上,也可以添加在处理请求的方法上, 通常用于配置请求路径 |
@GetMapping | Spring MVC | 添加在方法上,是将请求方式限制为GET的@RequestMapping |
@PostMapping | Spring MVC | 添加在方法上,是将请求方式限制为POST的@RequestMapping |
@DeleteMapping | Spring MVC | 添加在方法上,是将请求方式限制为DELETE的@RequestMapping |
@PutMapping | Spring MVC | 添加在方法上,是将请求方式限制为PUT的@RequestMapping |
@RequestParam | Spring MVC | 添加在请求参数上,可以: 1. 指定请求参数名称 2. 要求必须提交此参数 3. 指定请求参数的默认值 |
@PathVariable | Spring MVC | 添加在请求参数上,用于标记此参数的值来自URL中的占位符,如果URL中的占位符名称与方法的参数名称不同,需要配置此注解参数来指定URL中的占位符名称 |
@RequestBody | Spring MVC | 添加在请求参数上,用于标记此参数必须是对象格式的参数,如果未添加此注解,参数必须是FormData 格式的 |
@ExceptionHandler | Spring MVC | 添加在方法上,标记此方法是处理异常的方法,可以通过配置注解参数来指定需要处理的异常类型,如果没有配置注解参数,所处理的异常类型取决于方法的参数列表中的异常类型 |
@ControllerAdvice | Spring MVC | 添加在类上,标记此类中特定的方法将作用于每次处理请求的过程中 |
@RestControllerAdvice | Spring MVC | 添加在类上,是@ControllerAdvice 和@ResponseBody 的组合注解 |
@MapperScan | Mybatis | 添加在配置类上,用于指定Mapper接口的根包,Mybatis将根据此根包执行扫描,以找到各Mapper接口 |
@Mapper | Mybatis | 添加在Mapper接口上,用于标记此接口是Mybatis的Mapper接口,如果已经通过@MapperScan 配置能够找到此接口,则不需要使用此注解 |
@Param | Mybatis | 添加在Mapper接口中的抽象方法的参数上,用于指定参数名称,当使用此注解指定参数名称后,SQL中的#{} / ${} 占位符中的名称必须是此注解指定的名称,通常,当抽象方法的参数超过1个时,强烈建议在每个参数上使用此注解配置名称 |
@Select | Mybatis | 添加在Mapper接口的抽象方法上,可以通过此注解直接配置此抽象方法对应的SQL语句(不必将SQL语句配置在XML文件中),用于配置SELECT类的SQL语句,但是,非常不推荐这种做法 |
@Insert | Mybatis | 同上,用于配置INSERT类的SQL语句 |
@Update | Mybatis | 同上,用于配置UPDATE类的SQL语句 |
@Delete | Mybatis | 同上,用于配置DELETE类的SQL语句 |
@Transactional | Spring JDBC | 推荐添加的业务接口上,用于标记此接口中所有方法都是事务性的,或业务接口中的抽象方法上,用于此方法是事务性的 |
@SpringBootApplication | Spring Boot | 添加在类上,用于标记此类是Spring Boot的启动类,每个Spring Boot项目应该只有1个类添加了此注解 |
@SpringBootConfiguration | Spring Boot | 通常不需要显式的使用,它是@SpringBootApplication 的元注解之一 |
@SpringBootTest | Spring Boot | 添加在类上,用于标记此类是加载Spring环境的测试类 |
@Valid | Spring Validation | 添加在方法的参数上,标记此参数需要经过Validation框架的检查 |
@Validated | Spring Validation | 添加在方法的参数上,标记此参数需要经过Validation框架的检查;添加在类上,并结合方法上的检查注解(例如@NotNull 等)实现对未封装的参数的检查 |
@NotNull | Spring Validation | 添加在需要被检查的参数上,或添加在需要被检查的封装类型的属性上,用于配置“不允许为null”的检查规则 |
@NotEmpty | Spring Validation | 使用位置同@NotNull ,用于配置“不允许为空字符串”的检查规则 |
@NotBlank Spring | Validation | 使用位置同@NotNull ,用于配置“不允许为空白”的检查规则 |
@Pattern | Spring Validation | 使用位置同@NotNull ,用于配置正则表达式的检查规则 |
@Range | Spring Validation | 使用位置同@NotNull ,用于配置“数值必须在某个取值区间”的检查规则 |
@Api | Knife4j | 添加在控制器类上,通过此注解的tags属性配置API文档中的模块名称 |
@ApiOperation | Knife4j | 添加在控制器类中处理请求的方法上,用于配置业务名称 |
@ApiOperationSupport | Knife4j | 添加在控制器类中处理请求的方法上,通过此注解的order属性配置业务显示在API文档中时的排序序号 |
@ApiModelProperty | Knife4j | 添加在封装的请求参数类型中的属性上,用于配置请求参数的详细说明,包括:名称、数据类型、是否必须等 |
@ApiImplicitParam | Knife4j | 添加在控制器类中处理请求的方法上,用于配置请求参数的详细说明,包括:名称、数据类型、是否必须等 |
@ApiImplicitParams | Knife4j | 添加在控制器类中处理请求的方法上,如果需要通过@ApiImplicitParam 注解配置的参数超过1个,则必须将多个@ApiImplicitParam 注解作为此注解的参数 |
@ApiIgnore | Knife4j | 添加在请求参数上,用于标记API文档中将不关心此参数 |
@EnableGlobalMethodSecurity | Spring Security | 添加在配置类上,用于开启全局的方法级别的权限控制 |
@PreAuthorize | Spring Security | 添加在方法上,用于配置权限 |
@AuthenticationPrincipal | Spring Security | 添加在方法的参数上,且此参数应该是Security上下文中的认证信息中的当事人类型,用于为此参数注入值 |
@Data | Lombok | 添加在类上,将在编译期生成此类中所有属性的Setter 、Getter 方法,及hashCode() 、equals() 、toString() 方法 |
@Setter | Lombok | 添加在类上,将在编译期生成此类中所有属性的Setter 方法,也可以添加在类的属性上,将在编译期生成此属性的Setter方法 |
@Getter | Lombok | 添加在类上,将在编译期生成此类中所有属性的Getter 方法,也可以添加在类的属性上,将在编译期生成此属性的Getter方法 |
@EqualsAndHashcode | Lombok | 添加在类上,将在编译期生成基于此类中所有属性的hashCode() 、equals() 方法 |
@ToString | Lombok | 添加在类上,将在编译期生成基于此类中所有属性的toString() 方法 |
@NoArgConstructor | Lombok | 添加在类上,将在编译期生成此类的无参数构造方法 |
@AllArgsConstructor | Lombok | 添加在类上,将在编译期生成基于此类中所有属性的全参构造方法 |