【Spring】常用注解

218 阅读4分钟

@RestController

此注解相当于@Controller@ResponseBody的快捷方式。当使用此注解时,不需要再在方法上使用@ResponseBody注解。


@ResponseBody

默认返回的会被转成ModelAndView 类型(找.jsp文件),使用该注解后默认返回String类型;通过 HttpMessageConverter 接⼝转为指定格式的数据, JSON、 XML 等,响应给客户端

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;


@ResponseStatus

@ResponseStatus注解可以标注请求处理方法。使用此注解,可以指定响应所需要的HTTP STATUS。


@ExceptionHandler

特性1:一次声明、全接口有效

  • 使用ControllerAdvice 注解实现

特性2:就近原则 原理:

  1. 程序一开始会把所有的异常处理方法加载到Map中去,key为异常类型,value为解决方法
  2. 处理异常A时,会去Map取出异常A对应的method
  3. 如果没有,则在Map中把所有key取出来,找出所有异常A的父类
  4. 再找出继承深度最小的父类,拿到它的method
  5. 最后把异常A和method存到Map

@ControllerAdvice

通常与ExceptionHandler 搭配使用 搭配使用后所有@Controller类都能吃到ExceptionHandler的异常处理方法


@RequestMapping

@RequestMapping注解的主要用途是将Web请求与请求处理类中的方法进行映射。@RequestMapping注解对请求处理类中的请求处理方法进行标注;

@RequestMapping注解拥有以下的六个配置属性:

  • value:映射的请求URL或者其别名
  • method:兼容HTTP的方法名
  • params:根据HTTP参数的存在、缺省或值对请求进行过滤
  • header:根据HTTP Header的存在、缺省或值对请求进行过滤
  • consume:设定在HTTP请求正文中允许使用的媒体类型
  • product:在HTTP响应体中允许使用的媒体类型

提示:在使用@RequestMapping之前,请求处理类还需要使用@Controller或@RestController进行标记


@SpringBootApplication

@SpringBootApplication注解是一个快捷的配置注解,在被它标注的类中,可以定义一个或多个Bean,并自动触发自动配置Bean和自动扫描组件。此注解相当于@Configuration@EnableAutoConfiguration@ComponentScan的组合。在Spring Boot应用程序的主类中,就使用了此注解。

image.png

@EnableAutoConfiguration

@EnableAutoConfiguration注解用于通知Spring,根据当前类路径下引入的依赖包,自动配置与这些依赖包相关的配置项。

配置路径:org\springframework\boot\spring-boot-autoconfigure\2.2.4.RELEASE\spring-boot-autoconfigure-2.2.4.RELEASE.jar\META-INF\spring.factories

# Auto Configure 自动配置类 
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ 
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\

@Transational

spring实现事务支持,可以定义事务信息(事务隔离级别传播行为(什么时候为新事务)、超时、只读、回滚规则),通过 AOP 实现

参考资料:javaguide.cn/system-desi…

spring-transaction.md

很多资料都说需要先使用@EnableTransactionManagement开启事务 这一说法是针对Spring的 → 在SpringBoot中直接使用@Transactional即可

因为在SpringBoot的自动配置中,已经注入该注解

pom.xml中spring-boot-starter-parentspring-boot-dependenciesspring-boot-autoconfigure

去到spring-boot-autoconfigure 中spring.factories文件定义了Auto Configure 的内容

image.png

其中有Transaction的自动装配

//spring.factories文件
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration

//TransactionAutoConfiguration的静态内部类,加上了EnableTransactionManagement注解
public static class EnableTransactionManagementConfiguration {

        @Configuration(proxyBeanMethods = false)
        @EnableTransactionManagement(proxyTargetClass = false)
        @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
                        matchIfMissing = false)
        public static class JdkDynamicAutoProxyConfiguration {

        }

        @Configuration(proxyBeanMethods = false)
        @EnableTransactionManagement(proxyTargetClass = true)
        @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
                        matchIfMissing = true)
        public static class CglibAutoProxyConfiguration {

        }

}

事务隔离级别

  1. 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
  2. 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  3. 如果当前存在事务,就在嵌套事务内执行;如果当前没有事务则单独开启一个事务
  4. 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

@Bean

标记方法,返回一个Bean对象,能够动态获取一个Bean对象


@PathVariable和@RequestParam

PathVariable只能用于接收url路径上的参数

用@PathVariable请求接口时,URL是:www.test.com/user/getUse…

RequestParam只能用于接收请求带的params

用@RequestParam请求接口时,URL是:www.test.com/user/getUse…

  • 示例代码

    package com.lrm.springbootdemo.web;
    
    import org.springframework.web.bind.annotation.*;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @RestController
    @RequestMapping("/api/v1")
    public class HelloController {
    
        @GetMapping("/books/{username}")
        public Object testPathVariable(@PathVariable String username){
            Map<String,Object> map = new HashMap<>();
            map.put("username",username);
            return map;
        }
    
        @PostMapping("/books2")
        public Object testRequestParam(@RequestParam("name") String name,
                           @RequestParam("author") String author,
                           @RequestParam("isbn") String isbn) {
            Map<String, Object> book = new HashMap<String, Object>();
            book.put("name", name);
            book.put("author", author);
            book.put("isbn", isbn);
            return book;
        }
    
        @PostMapping("/books2/{id}")
        public Object test(@PathVariable("id") long id,@RequestParam("name") String name,
                           @RequestParam("author") String author,
                           @RequestParam("isbn") String isbn) {
            Map<String, Object> book = new HashMap<String, Object>();
            book.put("id",id);
            book.put("name", name);
            book.put("author", author);
            book.put("isbn", isbn);
            return book;
        }
    }
    

@Async

使用异步调用

参数只有一个value,指定线程池执行器Executor 的bean,有如下解释:

* May be used to determine the target executor to be used when executing this 
* method, matching the qualifier value (or the bean name) of a specific 
* {@link java.util.concurrent.Executor Executor} or 
* {@link org.springframework.core.task.TaskExecutor TaskExecutor} 
* bean definition. 
//必须为Executor或者TaskExecutor

所以需要定义一个getAsyncBean方法加上@Bean注解,否则使用默认的配置

同时该方法的类需要加上@EnableAsync@Configuration 注解(@Async 需要和@EnableAsync 一起才能使用)

@EnableAsync 注解还可以添加在SpringBoot启动类


@Scheduled

使用方法

  1. @SpringBootApplication中需要先添加@EnableScheduling注解
  2. 在ScheduledTask类中添加@Component注解,定时方法中添加@Scheduled注解即可

@Scheduled注解参数

  • fixedRate
  • fixedDelay
  • cron
  • zone
  • initialDelay