
以下逐一介绍个人认为比较重要的Spring注解概念,多取自源文件注释,皆为运行时注解,Target表示应用范围,Super表示继承关系。
@SpringBootApplication
Target:Type Super:SpringBootConfiguration,EnableAutoConfiguration
表面该类允许声明一些Bean方法以导入配置类,并且支持自动配置和组件扫描,等价于@Configuration、@EnableAutoConfiguration和@ComponentScan同时起作用。Spring boot项目默认的入口标记。
@Autowired
Target:Constructor,Method,Parameter,Field,AnnotationType
使构造函数、字段、设值方法或配置方法可以被Spring依赖注入工具自动装配(Autowired)。
用于构造函数:表明该构造函数作为Spring bean使用时,将被自动装配。任何给定bean类中,只允许存在一个构造函数的required属性设置为true,如果存在多个声明注解的构造函数,Spring容器将选择匹配最多依赖项的构造函数,如果没有一个候选函数可以满足要求,那么将使用缺省构造函数。如果一个类只声明了一个构造函数,那么它将始终被使用,即使没有注解。该注解不要求构造函数是public。
用于字段:字段在bean构造之后,任何配置方法被调用之前被注入。被注入的类需要是一个组件(@Component)。该注解不要求字段是public。
用于方法:配置方法可以有任意名称和任意数量的参数,这些参数中的每一个都将使用Spring容器中匹配到的bean进行自动装配。Bean属性设置方法实际上只是这种通用配置方法的一个特殊情况。该注解不要求配置方法是public。
用于参数:尽管从技术上讲,自Spring Framework 5.0以来,可以在单个方法或构造函数参数上声明@Autowired,但大多数框架都忽略了这些声明。核心Spring框架中唯一积极支持自动参数的部分是Spring -test模块中的JUnit Jupiter支持。
@开发者见解
关于Autowired
从官方文档上发现,自动装配可针对于字段/构造函数/设值方法,尽管我们通常用于字段。
以下方式是注入依赖的不同方式,本质上都是对内部组件(字段)的注入,效果等价。
@Autowired //不可省略
TalkContent talkContent;
TalkContent talkContent;
@Autowired //不可省略
public void setTalkContent(TalkContent talkContent) {
this.talkContent = talkContent;
}
TalkContent talkContent;
public TalkController(TalkContent talkContent) {
this.talkContent = talkContent;
}依赖注入的步骤为:
- 定义一个组件(@Component或其子类型)
- 客户代码声明某字段需要自动装配(@Autowired)
- 这段客户代码需要被扫描到(所在类被标记为@Controller或被其他组件装配)
@Component
Target:Type
表明该类是一个组件,当使用基于注解的配置和类路径扫描时,这些类被认为是自动检测的候选类。Component的子类型可以更好地表示“组件”这个语义。
@ComponentScan
Target:Type
配置用于@Configuration类的组件扫描指令。提供与Spring XML <context:component-scan> 元素相同的支持。可以指定basePackageClasses或basePackages(或其别名值)来定义要扫描的特定包。如果没有定义特定的包,将从声明此注解的类的包中进行扫描。注意<context:component-scan>元素具有注解-配置属性,但是此注解不会,这是因为在几乎所有使用@ComponentScan的情况下,都假定进行默认注解配置处理(例如,处理@Autowired和friends)。
@Repository
Target:Type Super:Component
表明该类是一个“仓库”——领域驱动设计中的一种封装存储,并提供数据访问机制的类。可以用于表示“数据访问对象”(DAO)模式。这个注解阐述了一个通用的原型,开发者可以根据实际情况酌情缩小其语义。
@Service
Target:Type Super:Component
表明该类是一个“服务”——领域驱动设计中的一种提供操作、独立存在且没有封装状态的接口。也可表示该类是一个业务服务Facade(外观模式),或其他类似的概念。这个注解阐述了一个通用的原型,开发者可以根据实际情况酌情缩小其语义。
@Controller
Target:Type Super:Component
表明该类是一个“控制器”(比如web控制器),该类作为一种特殊的组件,允许通过类路径扫描自动检测实现类。它通常与基于@RequestMapping的注解处理方法结合使用。
@RestController
Target:Type Super:Controller,ResponseBody
@RestController等价于@Controller+@ResponseBody的组合应用,用于提供Restful API。
@开发者见解
关于Component
Repository,Service,Controller都继承自Component,各代表领域中的不同抽象层次,其中除Controller是Spring web接口层以外,其他层都是概念方面的约定,没有规定Controller下一层一定是Service,也没有规定不能引入其他的抽象层次,比如我们可以定义自己的注解ServiceSupport/CacheRepository等。
Java对注解的表述中有一项:不直接影响代码执行的逻辑,这点在Spring生态体系内并不确切。Spring框架下,我们所有的代码被框架引擎包含,特定的注解将直接改变程序执行逻辑,比如@Component,你不能随便创建一个组件,然后在构造函数中抛异常。我们依赖@Component提供的“自动扫描候选组件”语义来进行面向组件式的编程,但也应注意它可能带来的副作用。
@Configuration
Target:Type Super:Component
表明该类将声明一个或多个@Bean方法,Spring容器可以处理这些方法,以在运行时为这些bean生成实例化对象。可以使用 @Component替代,不过使用@Configuration声明配置类更加语义化。
@Scope
Target:Type,Method
当与@Component一起用作类型级注解时,@Scope表示类型实例的作用域。当与@Bean一起用作方法级注解时,@Scope表示方法返回的实例的作用域。作用域表示实例的生命周期,Spring定义了以下几种作用域:
- singleton : 单例;Spring中的实例默认都是单例的。
- prototype : 原型;每次请求都会创建一个新的实例。
- request : 伴随HTTP请求;每一次HTTP请求都会产生一个新的实例,一次请求内实例是共享的。
- session : 伴随会话;每一次新的会话都会产生一个新的实例,一次会话内实例是共享的。
@Bean
Target:Method,AnnotationType
表明该方法产生一个Bean,该Bean由Spring容器管理。@Bean注解不提供概要、作用域、惰性加载、依赖或主要属性,它应该与@Profile、@Scope、@Lazy、@DependsOn和@Primary注解一起使用,以声明这些语义。@Profile允许选择性地包含某些bean;@Scope将bean的实例化规则从单例更改为指定规则;@Lazy让单例情况下的bean被延迟加载直到使用时;@DependsOn强制在创建该bean之前创建特定的其他bean,以及该bean通过直接引用表示的任何依赖关系,这通常对单例启动很有帮助;@Primary是一个在注入点级别解决歧义的机制。
通常,@Bean方法是在@Configuration类中声明的,在这种情况下,bean方法可以通过直接调用同一类中的其他@Bean方法来引用它们。@Bean方法也可以在未使用@Configuration注解的类中声明。例如,bean方法可以在@Component类中声明,甚至可以在普通的旧类中声明。在这种情况下,@Bean方法将以所谓的“lite”模式运作。在lite模式下的Bean方法将被容器视为普通工厂方法,适当地应用范围和生命周期回调。在这种情况下,包含类保持不变,包含类或工厂方法也没有不同寻常的约束。与@Configuration类中的bean方法的语义相反,当一个@bean方法在lite模式下调用另一个@bean方法时,调用的是一个标准的Java方法。
@Lazy
Target:Constructor,Method,Parameter,Field,Type
指示是否惰性初始化bean。可以直接或间接地用在组件上(@Component),也可以用在@Bean注解声明的方法上。如果@Component或@Bean定义中没有这个注解,就会发生立即初始化。如果存在并设置为true, @Bean或@Component在被另一个bean引用或从外围的BeanFactory显式检索之前不会被初始化。如果存在并设置为false,,bean将在启动时由执行单例初始化的bean工厂实例化。如果Lazy出现在@Configuration类中,这表明该@Configuration中的所有@Bean方法都应该被惰性初始化。
@ControllerAdvice
Target:Type Super:Component
用于声明@ExceptionHandler、@InitBinder或@ModelAttribute方法的特殊组件类,以便在多个@Controller中共享通用处理逻辑,这是一个AOP编程方式。
对于处理异常,将在第一个带有匹配异常处理函数方法的通知上选择@ExceptionHandler。对于模型属性和数据绑定初始化,@ModelAttribute和@InitBinder方法将遵循@ControllerAdvice顺序。注意:对于@ExceptionHandler方法,在异常捕获处理方法中,高层次的异常处理方法会优先于低层次的异常处理方法,
默认情况下,@ControllerAdvice中的方法全局应用于所有控制器。使用诸如注解、basePackageClasses和basePackages(或其别名值)这样的选择器来定义目标控制器的更小子集。如果声明了多个选择器,则应用布尔或逻辑,这意味着所选控制器应该至少匹配一个选择器。注意,选择器检查是在运行时执行的,因此添加许多选择器可能会对性能产生负面影响并增加复杂性。
@ExceptionHandler
Target:Method
用于处理特定类/方法中的异常的注解。
@RequestMapping
Target:Type,Method
用灵活的方法签名将web请求映射到请求处理类,即RequestMapping的value属性定义了接口名称。这个注解既可以在类上使用,也可以在方法上使用。在大多数情况下,在方法级别,应用程序更喜欢使用HTTP方法特定变体之一@GetMapping、@PostMapping、@PutMapping、@DeleteMapping或@PatchMapping。
@GetMapping
Target:Method
@GetMapping充当@RequestMapping(method = RequestMethod.GET)的快捷方式。
@PostMapping
Target:Method
@PostMapping充当@RequestMapping(method = RequestMethod.POST)的快捷方式。
@PutMapping
Target:Method
@PutMapping充当@RequestMapping(method = RequestMethod.PUT)的快捷方式。
@DeleteMapping
Target:Method
@DeleteMapping充当@RequestMapping(method = RequestMethod.DELETE)的快捷方式。
@PatchMapping
Target:Method
@PatchMapping充当@RequestMapping(method = RequestMethod.PATCH)的快捷方式。
@PathVariable
Target:Parameter
指出这个方法参数应该绑定到URI模板变量。支持RequestMapping带注解的处理程序方法。如果方法参数是Map类型,则映射将填充所有路径变量名和值。
代码示例片段1:
@GetMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return name;
}
//request:http://localhost:8080/hello/sunday
//response:sunday代码示例片段2:
@GetMapping("/hello/{id}/{name}")
public String hello(@PathVariable Map<String,String> map) {
return map.toString();
}
//request:http://localhost:8080/hello/10001/sunday
//response:{id=10001, name=sunday}@ResponseBody
Target:Type,Method
作用在方法上,表明方法返回值绑定到web响应体。作用在类上, 相当于类下所有方法声明了该注解。
@RequestBody
Target:Parameter
指示这个方法参数应绑定到web请求体。用于将Request请求的body部分绑定到Java对象上去(Content-Type需要为application/json),系统使用HttpMessageConverter或者自定义的HttpMessageConverter执行转换逻辑。可以选择使用@Valid注解参数以支持自动验证。
@Value
Target:Method,Parameter,Field,AnnotationType
在字段或方法参数级使用的注解,常用于表示配置文件中声明的变量值
@Validated
Target:Method,Parameter,Type
JavaX Valid的变体。为方便使用Spring的JSR-303标准而设计的参数校验注解,但不是特定于JSR-303,支持了分组验证功能,可以与@Valid一起使用。
@开发者见解
关于javax.validation
@Validated是Spring对于@Valid功能的增强,支持了分组校验,但由于@Validated不能用于字段,所以不支持嵌套注解,实际应用中需要两者的结合。
示例代码:
@RestController
public class TalkController {
@PostMapping("/content")
public void addContent(@Validated Content content, BindingResult bindingResult) {
doSomething();
}
}与Spring校验器有关的注解如下:(javax.validation)
- @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 字段必须是一个将来的日期
@ControllerAdvice
Target:Type Super:Component
特殊@Component,用于声明@ExceptionHandler、@InitBinder或@ModelAttribute方法的类,以便在多个@Controller类之间共享。对于处理异常,将在第一个带有匹配异常处理函数方法的通知上选择@ExceptionHandler。对于模型属性和数据绑定初始化,@ModelAttribute和@InitBinder方法将遵循@ControllerAdvice顺序。默认情况下,@ControllerAdvice中的方法全局应用于所有控制器。使用诸如注解、basePackageClasses和basePackages(或其别名值)这样的选择器来定义目标控制器的更小子集。如果声明了多个选择器,则应用布尔或逻辑,这意味着所选控制器应该至少匹配一个选择器。注意,选择器检查是在运行时执行的,因此添加许多选择器可能会对性能产生负面影响并增加复杂性。
@ExceptionHandler
Target:Method
表示该方法用于处理特定异常,且允许具有非常灵活的签名。支持以下类型的参数:
- 异常参数。作为一般异常声明或作为更具体的异常声明。如果注解本身没有通过它的value()缩小异常类型的范围,这也可以作为映射提示。
- 请求和/或响应对象(通常来自Servlet API)。例如ServletRequest / HttpServletRequest。
- 会话对象。典型的javax.servlet.http.HttpSession。这种类型的参数将强制存在相应的会话。因此,这样的参数永远不会是空的。注意,会话访问可能不是线程安全的。
- WebRequest或NativeWebRequest。允许通用请求参数访问和请求/会话属性访问,而不需要绑定到本机Servlet API。
- java.util.Locale。对于当前请求区域设置(由可用的最特定的区域设置解析器确定,例如配置的org.springframework.web.servlet。在Servlet环境中的LocaleResolver)。
- java.io.InputStream / java.io.Reader。用于访问请求的内容。这将是Servlet API公开的原始输入流/读取器。
- java.io.OutputStream / java.io.Writer。用于生成响应的内容。这将是Servlet API公开的原始输出流/写入器。
- org.springframework.ui.Model。作为从处理程序方法返回模型映射的替代方法。注意,所提供的模型没有预先使用常规模型属性填充,因此总是空的,这是为了方便为特定于异常的视图准备模型。
该方法支持以下返回类型:
- ModelAndView对象(源自于Servlet MVC)。
- org.springframework.ui.Model对象。
- java.util.Map对象
- org.springframework.web.servlet.View对象
- 解释为视图名的String对象。
- @ResponseBody注解方法(仅限servlet)来设置响应内容。返回值将使用消息转换器转换为响应流。
- HttpEntity<> / ResponseEntity<>(仅限servlet)对象设置响应头和内容。将使用消息转换器转换ResponseEntity主体并将其写入响应流。
- 如果方法本身处理响应(通过直接编写响应内容),则为空。
@Transactional
Target:Type,Method
描述一个方法或类上的事务属性。作用于类时,该注解将默认应用于声明类及其子类的所有方法,但不适用于父类。以下逐一介绍个人认为比较重要的Spring注解概念,多取自源文件注释,皆为运行时注解,Target表示应用范围,Super表示继承关系。
@SpringBootApplication
Target:Type Super:SpringBootConfiguration,EnableAutoConfiguration
表明该类允许声明一些Bean方法以导入配置类,并且支持自动配置和组件扫描,等价于@Configuration、@EnableAutoConfiguration和@ComponentScan同时起作用。Spring boot项目默认的入口标记。
@Autowired
Target:Constructor,Method,Parameter,Field,AnnotationType
使构造函数、字段、设值方法或配置方法可以被Spring依赖注入工具自动装配(Autowired)。
用于构造函数:表明该构造函数作为Spring bean使用时,将被自动装配。任何给定bean类中,只允许存在一个构造函数的required属性设置为true,如果存在多个声明注解的构造函数,Spring容器将选择匹配最多依赖项的构造函数,如果没有一个候选函数可以满足要求,那么将使用缺省构造函数。如果一个类只声明了一个构造函数,那么它将始终被使用,即使没有注解。该注解不要求构造函数是public。
用于字段:字段在bean构造之后,任何配置方法被调用之前被注入。被注入的类需要是一个组件(@Component)。该注解不要求字段是public。
用于方法:配置方法可以有任意名称和任意数量的参数,这些参数中的每一个都将使用Spring容器中匹配到的bean进行自动装配。Bean属性设置方法实际上只是这种通用配置方法的一个特殊情况。该注解不要求配置方法是public。
用于参数:尽管从技术上讲,自Spring Framework 5.0以来,可以在单个方法或构造函数参数上声明@Autowired,但大多数框架都忽略了这些声明。核心Spring框架中唯一积极支持自动参数的部分是Spring -test模块中的JUnit Jupiter支持。
@开发者见解
关于Autowired
从官方文档上发现,自动装配可针对于字段/构造函数/设值方法,尽管我们通常用于字段。
以下方式是注入依赖的不同方式,本质上都是对内部组件(字段)的注入,效果等价。
@Autowired //不可省略
TalkContent talkContent;
TalkContent talkContent;
@Autowired //不可省略
public void setTalkContent(TalkContent talkContent) {
this.talkContent = talkContent;
}
TalkContent talkContent;
public TalkController(TalkContent talkContent) {
this.talkContent = talkContent;
}依赖注入的步骤为:
- 定义一个组件(@Component或其子类型)
- 客户代码声明某字段需要自动装配(@Autowired)
- 这段客户代码需要被扫描到(所在类被标记为@Controller或被其他组件装配)
@Component
Target:Type
表明该类是一个组件,当使用基于注解的配置和类路径扫描时,这些类被认为是自动检测的候选类。Component的子类型可以更好地表示“组件”这个语义。
@ComponentScan
Target:Type
配置用于@Configuration类的组件扫描指令。提供与Spring XML <context:component-scan> 元素相同的支持。可以指定basePackageClasses或basePackages(或其别名值)来定义要扫描的特定包。如果没有定义特定的包,将从声明此注解的类的包中进行扫描。注意<context:component-scan>元素具有注解-配置属性,但是此注解不会,这是因为在几乎所有使用@ComponentScan的情况下,都假定进行默认注解配置处理(例如,处理@Autowired和friends)。
@Repository
Target:Type Super:Component
表明该类是一个“仓库”——领域驱动设计中的一种封装存储,并提供数据访问机制的类。可以用于表示“数据访问对象”(DAO)模式。这个注解阐述了一个通用的原型,开发者可以根据实际情况酌情缩小其语义。
@Service
Target:Type Super:Component
表明该类是一个“服务”——领域驱动设计中的一种提供操作、独立存在且没有封装状态的接口。也可表示该类是一个业务服务Facade(外观模式),或其他类似的概念。这个注解阐述了一个通用的原型,开发者可以根据实际情况酌情缩小其语义。
@Controller
Target:Type Super:Component
表明该类是一个“控制器”(比如web控制器),该类作为一种特殊的组件,允许通过类路径扫描自动检测实现类。它通常与基于@RequestMapping的注解处理方法结合使用。
@RestController
Target:Type Super:Controller,ResponseBody
@RestController等价于@Controller+@ResponseBody的组合应用,用于提供Restful API。
@开发者见解
关于Component
Repository,Service,Controller都继承自Component,各代表领域中的不同抽象层次,其中除Controller是Spring web接口层以外,其他层都是概念方面的约定,没有规定Controller下一层一定是Service,也没有规定不能引入其他的抽象层次,比如我们可以定义自己的注解ServiceSupport/CacheRepository等。
Java对注解的表述中有一项:不直接影响代码执行的逻辑,这点在Spring生态体系内并不确切。Spring框架下,我们所有的代码被框架引擎包含,特定的注解将直接改变程序执行逻辑,比如@Component,你不能随便创建一个组件,然后在构造函数中抛异常。我们依赖@Component提供的“自动扫描候选组件”语义来进行面向组件式的编程,但也应注意它可能带来的副作用。
@Configuration
Target:Type Super:Component
表明该类将声明一个或多个@Bean方法,Spring容器可以处理这些方法,以在运行时为这些bean生成实例化对象。可以使用 @Component替代,不过使用@Configuration声明配置类更加语义化。
@Scope
Target:Type,Method
当与@Component一起用作类型级注解时,@Scope表示类型实例的作用域。当与@Bean一起用作方法级注解时,@Scope表示方法返回的实例的作用域。作用域表示实例的生命周期,Spring定义了以下几种作用域:
- singleton : 单例;Spring中的实例默认都是单例的。
- prototype : 原型;每次请求都会创建一个新的实例。
- request : 伴随HTTP请求;每一次HTTP请求都会产生一个新的实例,一次请求内实例是共享的。
- session : 伴随会话;每一次新的会话都会产生一个新的实例,一次会话内实例是共享的。
@Bean
Target:Method,AnnotationType
表明该方法产生一个Bean,该Bean由Spring容器管理。@Bean注解不提供概要、作用域、惰性加载、依赖或主要属性,它应该与@Profile、@Scope、@Lazy、@DependsOn和@Primary注解一起使用,以声明这些语义。@Profile允许选择性地包含某些bean;@Scope将bean的实例化规则从单例更改为指定规则;@Lazy让单例情况下的bean被延迟加载直到使用时;@DependsOn强制在创建该bean之前创建特定的其他bean,以及该bean通过直接引用表示的任何依赖关系,这通常对单例启动很有帮助;@Primary是一个在注入点级别解决歧义的机制。
通常,@Bean方法是在@Configuration类中声明的,在这种情况下,bean方法可以通过直接调用同一类中的其他@Bean方法来引用它们。@Bean方法也可以在未使用@Configuration注解的类中声明。例如,bean方法可以在@Component类中声明,甚至可以在普通的旧类中声明。在这种情况下,@Bean方法将以所谓的“lite”模式运作。在lite模式下的Bean方法将被容器视为普通工厂方法,适当地应用范围和生命周期回调。在这种情况下,包含类保持不变,包含类或工厂方法也没有不同寻常的约束。与@Configuration类中的bean方法的语义相反,当一个@bean方法在lite模式下调用另一个@bean方法时,调用的是一个标准的Java方法。
@Lazy
Target:Constructor,Method,Parameter,Field,Type
指示是否惰性初始化bean。可以直接或间接地用在组件上(@Component),也可以用在@Bean注解声明的方法上。如果@Component或@Bean定义中没有这个注解,就会发生立即初始化。如果存在并设置为true, @Bean或@Component在被另一个bean引用或从外围的BeanFactory显式检索之前不会被初始化。如果存在并设置为false,,bean将在启动时由执行单例初始化的bean工厂实例化。如果Lazy出现在@Configuration类中,这表明该@Configuration中的所有@Bean方法都应该被惰性初始化。
@RequestMapping
Target:Type,Method
用灵活的方法签名将web请求映射到请求处理类,即RequestMapping的value属性定义了接口名称。这个注解既可以在类上使用,也可以在方法上使用。在大多数情况下,在方法级别,应用程序更喜欢使用HTTP方法特定变体之一@GetMapping、@PostMapping、@PutMapping、@DeleteMapping或@PatchMapping。
@GetMapping
Target:Method
@GetMapping充当@RequestMapping(method = RequestMethod.GET)的快捷方式。
@PostMapping
Target:Method
@PostMapping充当@RequestMapping(method = RequestMethod.POST)的快捷方式。
@PutMapping
Target:Method
@PutMapping充当@RequestMapping(method = RequestMethod.PUT)的快捷方式。
@DeleteMapping
Target:Method
@DeleteMapping充当@RequestMapping(method = RequestMethod.DELETE)的快捷方式。
@PatchMapping
Target:Method
@PatchMapping充当@RequestMapping(method = RequestMethod.PATCH)的快捷方式。
@PathVariable
Target:Parameter
指出这个方法参数应该绑定到URI模板变量。支持RequestMapping带注解的处理程序方法。如果方法参数是Map类型,则映射将填充所有路径变量名和值。
代码示例片段1:
@GetMapping("/hello/{name}")
public String hello(@PathVariable String name) {
return name;
}
//request:http://localhost:8080/hello/sunday
//response:sunday代码示例片段2:
@GetMapping("/hello/{id}/{name}")
public String hello(@PathVariable Map<String,String> map) {
return map.toString();
}
//request:http://localhost:8080/hello/10001/sunday
//response:{id=10001, name=sunday}@ResponseBody
Target:Type,Method
作用在方法上,表明方法返回值绑定到web响应体。作用在类上, 相当于类下所有方法声明了该注解。
@RequestBody
Target:Parameter
指示这个方法参数应绑定到web请求体。用于将Request请求的body部分绑定到Java对象上去(Content-Type需要为application/json),系统使用HttpMessageConverter或者自定义的HttpMessageConverter执行转换逻辑。可以选择使用@Valid注解参数以支持自动验证。
@Value
Target:Method,Parameter,Field,AnnotationType
在字段或方法参数级使用的注解,常用于表示配置文件中声明的变量值
@Validated
Target:Method,Parameter,Type
JavaX Valid的变体。为方便使用Spring的JSR-303标准而设计的参数校验注解,但不是特定于JSR-303,支持了分组验证功能,可以与@Valid一起使用。
@开发者见解
关于javax.validation
@Validated是Spring对于@Valid功能的增强,支持了分组校验,但由于@Validated不能用于字段,所以不支持嵌套注解,实际应用中需要两者的结合。
示例代码:
@RestController
public class TalkController {
@PostMapping("/content")
public void addContent(@Validated Content content, BindingResult bindingResult) {
doSomething();
}
}与Spring校验器有关的注解如下:(javax.validation)
- @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 字段必须是一个将来的日期
@ControllerAdvice
Target:Type Super:Component
特殊@Component,用于声明@ExceptionHandler、@InitBinder或@ModelAttribute方法的类,以便在多个@Controller类之间共享。对于处理异常,将在第一个带有匹配异常处理函数方法的通知上选择@ExceptionHandler。对于模型属性和数据绑定初始化,@ModelAttribute和@InitBinder方法将遵循@ControllerAdvice顺序。默认情况下,@ControllerAdvice中的方法全局应用于所有控制器。使用诸如注解、basePackageClasses和basePackages(或其别名值)这样的选择器来定义目标控制器的更小子集。如果声明了多个选择器,则应用布尔或逻辑,这意味着所选控制器应该至少匹配一个选择器。注意,选择器检查是在运行时执行的,因此添加许多选择器可能会对性能产生负面影响并增加复杂性。
@ExceptionHandler
Target:Method
表示该方法用于处理特定异常,且允许具有非常灵活的签名。支持以下类型的参数:
- 异常参数。作为一般异常声明或作为更具体的异常声明。如果注解本身没有通过它的value()缩小异常类型的范围,这也可以作为映射提示。
- 请求和/或响应对象(通常来自Servlet API)。例如ServletRequest / HttpServletRequest。
- 会话对象。典型的javax.servlet.http.HttpSession。这种类型的参数将强制存在相应的会话。因此,这样的参数永远不会是空的。注意,会话访问可能不是线程安全的。
- WebRequest或NativeWebRequest。允许通用请求参数访问和请求/会话属性访问,而不需要绑定到本机Servlet API。
- java.util.Locale。对于当前请求区域设置(由可用的最特定的区域设置解析器确定,例如配置的org.springframework.web.servlet。在Servlet环境中的LocaleResolver)。
- java.io.InputStream / java.io.Reader。用于访问请求的内容。这将是Servlet API公开的原始输入流/读取器。
- java.io.OutputStream / java.io.Writer。用于生成响应的内容。这将是Servlet API公开的原始输出流/写入器。
- org.springframework.ui.Model。作为从处理程序方法返回模型映射的替代方法。注意,所提供的模型没有预先使用常规模型属性填充,因此总是空的,这是为了方便为特定于异常的视图准备模型。
该方法支持以下返回类型:
- ModelAndView对象(源自于Servlet MVC)。
- org.springframework.ui.Model对象。
- java.util.Map对象
- org.springframework.web.servlet.View对象
- 解释为视图名的String对象。
- @ResponseBody注解方法(仅限servlet)来设置响应内容。返回值将使用消息转换器转换为响应流。
- HttpEntity<> / ResponseEntity<>(仅限servlet)对象设置响应头和内容。将使用消息转换器转换ResponseEntity主体并将其写入响应流。
- 如果方法本身处理响应(通过直接编写响应内容),则为空。
@Transactional
Target:Type,Method
描述一个方法或类上的事务属性。作用于类时,该注解将默认应用于声明类及其子类的所有方法,但不适用于父类。