Spring 是 Java 开发最常用的框架之一,熟练掌握 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 指定顺序优先级。
@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,而在此前一直在用其他方式来实现同类功能。大型项目的配置、依赖非常复杂,熟练掌握常用注解可以有效提升开发效率。
本文来源:程序之心,转载请注明出处!
最新内容
© 2016 - 2024 chengxuzhixin.com All Rights Reserved.