30 个 Spring 常用注解与差异总结

2021-03-15 From 程序之心 By 丁仪

Spring 是 Java 开发最常用的框架之一,熟练掌握 Spring 注解有助于面试和提升工作效率。本文简单总结最常用的注解和注解间的差异。

Spring 上下文注解

@Configuration、@Bean、@Import、@ImportResource

作用:使用注解配置 Spring Bean。

在类上加上 @Configuration 注解后,可以在类里面的方法上加上 @Bean 注解来定义 bean。当有多个 Configuration 类时,可以使用 @Import 导入其他配置类。如果有 xml 配置的 bean,可以使用 @ImportResource 导入 xml 配置。


@ComponentScan

作用:使用注解配置 bean 扫描范围。

通过这个注解,可以配置扫描 bean 的基础包路径、懒加载、bean 过滤器等。


@Component、@Service、@Repository

作用:都可以定义 bean,但略有区别。

@Service 一般用于修饰 service 层的组件,@Repository 一般用于 DAO 层组件,@Component 泛指组件。通常都可以用 @Component,但是为了更好的维护性和扩展性,建议使用具体的注解进行区分。


@Conditional

作用:定义 bean 的生效条件。包括 @ConditionalOnProperty 、@ConditionalOnMissingBean 等以 @Conditional* 开头的多个注解。

默认情况下 bean 是一定会生成的,而在复杂的业务场景中需要支持按需加载。如通过配置来决定 bean 是否启用,或者在 Springboot 中 bean 没有配置时设置默认的 bean,都可以使用此注解实现。


@Scope

作用:定义 bean 的作用域。

需要在定义 bean 的时候使用,常用的作用域有四个:

singleton:单例模式,是默认值,上下文中只有唯一的实例;

prototype:原型模式,每次请求都会生成一个新的实例;

request:在一次 HTTP 请求内生成新的实例,并且仅在当前请求内有效;

session:在一次会话内生成新的实例,并且仅在当前会话内有效;


@Autowired、@Resource

作用:自动注入依赖的 bean,可以用于构造器、字段、setter 方法。

@Autowired:默认 byType 进行注入,如有多个按 byName 匹配,仍有多个则报错;如需设置 name 需要配合使用 @Qualifier 设置 name;可以设置非必须,找不到合适的 bean 不报错;

@Resource:默认 byName 进行注入,可以指定 name 进行匹配;如果不指定 name 而默认 name 匹配不到,则 byType 查找,找不到合适的 bean 或者找到多个则报错;


@Value

作用:自动注入配置项的值。

可以用于字段、方法,或者构造器、方法的入参。可以指定默认值,未配置有效值的时候自动注入默认值。


@ConfigurationProperties

作用:读取配置并注入到 bean。

使用 prefix 配置前缀,对应到 application.properties 文件中的一系列配置,并把配置按字段名注入到 bean 中。注入的过程,类似于使用了多个 @Value 注解。


@PostConstruct、@PreDestory

作用:在 bean 的生命周期中进行初始化和销毁处理。

一个注解在一个 bean 中只能有一个方法使用,返回值必须是 void。


@DependsOn、@Order

作用:控制 bean 的顺序。

如果多个 bean 强依赖顺序,比如 B 必须在 A 后面初始化,可以在 B 加上 @DependsOn("A") 来强制指定 B 在 A 之后进行初始化。如 C 有多个实例 C1、C2、C3,希望自动注入 List 字段后保持固定顺序,则可以使用 @Order 指定顺序优先级。

Spring MVC 注解

@Controller、@RequestMapping

作用:在 SpringMVC 中定义一个 web 页面。

@Controller 用于定义控制器类,@RequestMapping 用于定义 URI 路径。@RequestMapping 可以同时在类和方法上使用,运行时类和方法上的路径会做合并。


@RestController

@RestController 与 @Controller 类似,不同在于是 REST 风格的控制器。方法返回值经过 converter 转换后直接返回到前端,效果相当于 @Controller 和 @ResponseBody 的合集。


@GetMapping

作用:定义仅支持 GET 请求的页面。

等价于在 @RequestMapping 中设置 method=RequestMethod.GET。不支持 GET 以外的其他请求。


@PostMapping

作用:定义仅支持 POST 请求的页面。

等价于在 @RequestMapping 中设置 method=RequestMethod.POST。不支持 POST 以外的其他请求。


@PathVariable

作用:从 URI 路径中获取参数。

使用此注解后,方法可以匹配多个 URI,并且在请求匹配后把匹配的动态部分作为入参传给方法。


@RequestParam

作用:用于从 query 或 form data 中提取参数。

默认是必填项,不传会报错,可以设置 required=false 来实现非必填,或者使用 Optional 类型接收参数也能实现非必填。Spring 会自动转换参数的类型。如果入参字段是 Map 类型,并且没有参数匹配入参的名字,会把所有的参数都注入。


@RequestBody

作用:从请求体中提取 json 入参。

只支持请求类型为 application/json 的数据,且数据会使用 Converter 转换为定义的参数类型。


@ResponseBody

作用:直接返回返回值,而不需要做转换以及模板渲染。

@ResponseBody 也可以用在类上,所有的方法都会继承此注解。


@ExceptionHandler

作用:定义处理异常的方法。

异常发生时,Exception 作为入参传入方法,由业务自行处理。当异常处理方法定义在 @Controller 类中时,只在当前类生效。


@ControllerAdvice、@RestControllerAdvice

作用:定义全局的异常处理

如果既有 @Controller 类的异常处理,同时也有 @ControllerAdvice 类的异常处理,@ControllerAdvice 异常处理优先级更低,在更晚的时候进行处理。@ControllerAdvice 默认应用于所有的请求,可以设置注解、包路径、Controller 类型来缩小应用范围。

小结

有些注解是查询文档的时候才发现的,比如 @ExceptionHandler,而在此前一直在用其他方式来实现同类功能。大型项目的配置、依赖非常复杂,熟练掌握常用注解可以有效提升开发效率。

本文来源:程序之心,转载请注明出处!

本文地址:https://chengxuzhixin.com/blog/article/200080.html

发表感想

© 2016 - 2022 chengxuzhixin.com All Rights Reserved.

浙ICP备2021034854号-1    浙公网安备 33011002016107号