Java学习-----SpringBoot的常用注解(下)

        在 SpringBoot 开发中,除了上篇介绍的核心注解外,还有许多在特定场景下发挥重要作用的注解。这些注解进一步简化了开发流程,提升了代码的可维护性和扩展性。本文将继续解析 SpringBoot 中常用的注解,包括请求参数、响应处理、事务管理等相关注解。

(一)请求参数相关注解

        这类注解主要用于从 HTTP 请求中获取参数,是控制器处理请求的关键工具。

  1. @PathVariable

    • 定义:用于获取 URL 路径中的占位符参数。
    • 作用:将 URL 路径中指定位置的参数绑定到控制器方法的参数上,适用于 RESTful 风格的接口。
    • 原理:SpringMVC 解析请求路径时,根据注解中指定的参数名(或默认参数名)匹配路径中的占位符,并将其值转换为对应的数据类型后注入方法参数。
    • 应用场景:URL 路径中包含动态参数的情况,如查询某个具体资源的详情。
    • 优点:
      • 符合 RESTful 设计风格,URL 路径更简洁直观。
      • 能直接获取路径参数,无需手动解析。
    • 缺点:
      • 路径参数类型转换失败时会抛出异常,需要额外处理。
      • 若路径参数较多,URL 可读性可能下降。
    • 代码示例如下:
    @RestController
    @RequestMapping("/books")
    public class BookController {
        @GetMapping("/{bookId}")
        public Book getBookDetail(@PathVariable("bookId") Long id) {
            // 根据id查询书籍详情的业务逻辑
            return bookService.getBookById(id);
        }
    }
    
  2. @RequestParam

    • 定义:用于获取 HTTP 请求中的查询参数(即 URL 中?后面的参数)。
    • 作用:将请求中的查询参数绑定到控制器方法的参数上,支持设置参数是否必填、默认值等。
    • 原理:SpringMVC 通过解析请求的参数列表,根据注解中指定的参数名匹配查询参数,并进行类型转换后注入方法参数。
    • 应用场景:需要从请求查询参数中获取数据的场景,如分页查询、条件筛选等。
    • 优点:
      • 灵活设置参数是否必填(required属性)和默认值(defaultValue属性)。
      • 支持多种数据类型的自动转换。
    • 缺点:
      • 当查询参数较多时,方法参数列表会显得冗长。
    • 代码示例如下:
    @RestController
    @RequestMapping("/students")
    public class StudentController {
        @GetMapping("/list")
        public List<Student> getStudentList(
                @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
                @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
            // 分页查询学生列表的业务逻辑
            return studentService.getStudentList(pageNum, pageSize);
        }
    }
    
  3. @RequestBody

    • 定义:用于接收 HTTP 请求体中的数据,并将其转换为指定的 Java 对象。
    • 作用:主要用于处理 POST、PUT 等请求中包含的 JSON、XML 等格式的请求体数据,实现请求数据到 Java 对象的自动绑定。
    • 原理:SpringMVC 通过消息转换器(如MappingJackson2HttpMessageConverter)将请求体中的数据转换为注解指定的 Java 对象类型。
    • 应用场景:创建资源、更新资源等需要提交大量数据的场景,如用户注册、修改用户信息等。
    • 优点:
      • 能自动将请求体数据转换为 Java 对象,简化数据处理流程。
      • 支持复杂对象的嵌套转换。
    • 缺点:
      • 仅适用于包含请求体的 HTTP 方法(如 POST、PUT)。
      • 数据转换失败时需要进行异常处理。
    • 代码示例如下:
    @RestController
    @RequestMapping("/users")
    public class UserController {
        @PostMapping
        public User createUser(@RequestBody User user) {
            // 创建用户的业务逻辑
            return userService.saveUser(user);
        }
    }
    
  4. @RequestHeader 与 @CookieValue

    • 定义:@RequestHeader用于获取 HTTP 请求头中的信息;@CookieValue用于获取 HTTP 请求中的 Cookie 值。
    • 作用:分别从请求头和 Cookie 中提取指定的数据,满足特定业务需求。
    • 原理:SpringMVC 解析请求的头部信息和 Cookie,根据注解中指定的名称获取对应的值并注入方法参数。
    • 应用场景:
      • @RequestHeader:获取请求的 Content-Type、Authorization 等头部信息。
      • @CookieValue:获取用户身份标识等存储在 Cookie 中的信息。
    • 优点:方便快捷地获取请求头和 Cookie 中的数据。
    • 缺点:若请求中不包含指定的头部或 Cookie,且未设置默认值,会抛出异常。
    • 代码示例如下:

    • @RestController
      public class HeaderController {
          @GetMapping("/headerInfo")
          public String getHeaderInfo(
                  @RequestHeader("User-Agent") String userAgent,
                  @CookieValue(value = "sessionId", required = false) String sessionId) {
              return "User-Agent: " + userAgent + ", sessionId: " + sessionId;
          }
      }
      

    (二)响应处理相关注解

    这类注解用于控制控制器方法的响应结果,如设置响应体、响应状态码等。

    1. @ResponseBody

      • 定义:用于将控制器方法的返回值直接作为 HTTP 响应体返回给客户端。
      • 作用:替代传统的视图解析器,适用于返回 JSON、XML 等数据格式的接口,无需跳转页面。
      • 原理:SpringMVC 通过消息转换器将方法返回值转换为指定的媒体类型(如 application/json),并写入响应体。
      • 应用场景:开发 RESTful API 接口,返回数据给前端异步请求。
      • 优点:简化数据响应流程,直接返回数据对象。
      • 缺点:若需要返回视图,不能使用该注解。
      • 代码示例如下:
      @Controller
      @RequestMapping("/api")
      public class ApiController {
          @GetMapping("/data")
          @ResponseBody
          public Map<String, Object> getData() {
              Map<String, Object> data = new HashMap<>();
              data.put("name", "SpringBoot");
              data.put("version", "2.7.0");
              return data;
          }
      }
      
    2. @RestController

      • 定义:@RestController@Controller@ResponseBody的组合注解。
      • 作用:标识控制器类,同时指定该类中所有方法的返回值都直接作为响应体返回,无需再单独添加@ResponseBody
      • 原理:继承了@Controller的组件扫描功能和@ResponseBody的响应体处理功能。
      • 应用场景:专门用于开发 RESTful API 的控制器类。
      • 优点:简化代码,避免在每个方法上重复添加@ResponseBody
      • 缺点:无法直接返回视图,适用于纯数据接口开发。
      • 代码示例如下:
      @RestController
      @RequestMapping("/products")
      public class ProductController {
          @GetMapping
          public List<Product> getProducts() {
              // 查询产品列表的业务逻辑
              return productService.getAllProducts();
          }
      }
      
    3. @ResponseStatus

      • 定义:用于指定控制器方法返回的 HTTP 响应状态码。
      • 作用:明确设置响应的状态码,使客户端能更清晰地了解请求处理结果。
      • 原理:SpringMVC 在方法执行完成后,根据注解中指定的状态码设置响应的状态。
      • 应用场景:
        • 成功创建资源时返回 201(Created)。
        • 资源不存在时返回 404(Not Found)等。
      • 优点:使响应状态更符合 HTTP 规范,便于客户端处理。
      • 缺点:若使用不当,可能返回不符合实际情况的状态码,导致客户端误解。
      • 代码示例如下:
      @RestController
      @RequestMapping("/articles")
      public class ArticleController {
          @PostMapping
          @ResponseStatus(HttpStatus.CREATED)
          public Article addArticle(@RequestBody Article article) {
              // 添加文章的业务逻辑
              return articleService.addArticle(article);
          }
      }
      
    (七)事务管理相关注解

    在数据操作中,事务管理至关重要,@Transactional是 Spring 中用于声明式事务管理的核心注解。

    (1)定义:@Transactional用于指定方法或类需要进行事务管理。

    (2)作用:确保被注解的方法或类中的所有数据库操作在一个事务中执行,要么全部成功,要么全部失败,保证数据的一致性。

    (3)原理:Spring 通过 AOP(面向切面编程)机制,在方法执行前后创建事务、提交事务或回滚事务。当方法抛出指定异常(默认是 RuntimeException 及其子类)时,事务回滚;否则,事务提交。

    (4)应用场景:涉及多步数据库操作的业务逻辑,如转账、订单创建等。

    • 优点:
      • 无需手动编写事务管理代码,简化开发。
      • 可通过注解属性灵活配置事务的传播行为、隔离级别、超时时间等。
    • 缺点:
      • 若注解使用不当(如应用在非公共方法上),可能导致事务不生效。
      • 事务回滚机制依赖异常抛出,需要合理处理异常。
    • 代码示例如下:
    @Service
    public class OrderService {
        @Autowired
        private OrderRepository orderRepository;
        @Autowired
        private InventoryRepository inventoryRepository;
    
        @Transactional
        public void createOrder(Order order) {
            // 扣减库存
            inventoryRepository.reduceStock(order.getProductId(), order.getQuantity());
            // 创建订单
            orderRepository.save(order);
        }
    }
    
    (八)配置相关注解

    SpringBoot 支持外部化配置,通过相关注解可将配置文件中的值注入到 Bean 中。

    1. @ConfigurationProperties

      • 定义:用于将配置文件中的属性批量绑定到 JavaBean 的属性上。
      • 作用:简化配置信息的获取,将分散的配置集中管理。
      • 原理:SpringBoot 启动时,会扫描带有@ConfigurationProperties的类,根据指定的前缀(prefix)从配置文件中读取对应属性,并赋值给类中的属性。
      • 应用场景:需要读取多个相关配置项的场景,如数据库连接信息、第三方服务配置等。
      • 优点:
        • 支持批量绑定配置,减少代码量。
        • 支持配置属性的校验(结合@Validated)。
      • 缺点:配置类需要定义对应的 getter 和 setter 方法,略显繁琐。
      • 代码示例如下:
      @Component
      @ConfigurationProperties(prefix = "jdbc")
      public class JdbcConfig {
          private String url;
          private String username;
          private String password;
      
          // getter和setter方法
          public String getUrl() { return url; }
          public void setUrl(String url) { this.url = url; }
          public String getUsername() { return username; }
          public void setUsername(String username) { this.username = username; }
          public String getPassword() { return password; }
          public void setPassword(String password) { this.password = password; }
      }
      
       

      配置文件(application.properties):

      jdbc.url=jdbc:mysql://localhost:3306/test
      jdbc.username=root
      jdbc.password=123456
      
    2. @Value

      • 定义:用于将配置文件中的单个属性值注入到 Bean 的字段或方法参数中。
      • 作用:获取单个配置项的值,适用于只需少量配置的场景。
      • 原理:Spring 通过 EL 表达式(如${property.name})从配置文件中解析对应的属性值,并注入到目标位置。
      • 应用场景:获取单个简单的配置值,如应用名称、端口号等。
      • 优点:使用简单,无需定义专门的配置类。
      • 缺点:对于多个相关配置,使用@Value会导致代码分散,不易维护。
      • 代码示例如下:
      @Service
      public class AppService {
          @Value("${app.name}")
          private String appName;
      
          public String getAppName() {
              return appName;
          }
      }
      
    (九)AOP 相关注解

    AOP(面向切面编程)在 Spring 中应用广泛,相关注解用于定义切面、切入点和通知。

    1. @Aspect

      • 定义:用于标识一个类为切面类,包含切入点和通知。
      • 作用:将横切关注点(如日志、安全、事务等)与业务逻辑分离。
      • 原理:Spring 容器扫描到@Aspect注解的类后,会将其作为切面处理,结合切入点和通知实现 AOP 功能。
      • 应用场景:实现日志记录、性能监控、权限校验等横切功能。
      • 代码示例如下:
      @Aspect
      @Component
      public class LogAspect {
          // 切入点和通知定义
      }
      
    2. @Pointcut

      • 定义:用于定义切入点表达式,指定哪些方法需要被增强。
      • 作用:确定 AOP 的作用范围。
      • 原理:切入点表达式通过匹配方法的签名(如类名、方法名、参数等)来确定目标方法。
      • 代码示例如下:
      @Pointcut("execution(* com.example.service.*Service.*(..))")
      public void servicePointcut() {}
      
    3. @Before、@After、@Around 等通知注解

      • 定义:这些注解用于定义通知类型,即切面在目标方法执行的不同时机执行的逻辑。
      • 作用:
        • @Before:在目标方法执行前执行。
        • @After:在目标方法执行后执行(无论是否异常)。
        • @Around:环绕目标方法执行,可控制目标方法的执行。
      • 代码示例如下:
      @Before("servicePointcut()")
      public void beforeAdvice(JoinPoint joinPoint) {
          // 目标方法执行前的逻辑,如日志记录
      }
      
      @Around("servicePointcut()")
      public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
          long start = System.currentTimeMillis();
          Object result = joinPoint.proceed();
          long end = System.currentTimeMillis();
          // 记录方法执行时间
          return result;
      }
      
    (十)其他常用注解
    1. @Bean

      • 定义:用于在配置类中定义一个 Bean,并将其注册到 Spring 容器中。
      • 作用:替代 XML 配置中的<bean>标签,适用于第三方类的 Bean 定义。
      • 原理:Spring 容器在初始化配置类时,会执行带有@Bean注解的方法,并将方法返回值作为 Bean 注册到容器中。
      • 代码示例如下:
      @Configuration
      public class AppConfig {
          @Bean
          public RestTemplate restTemplate() {
              return new RestTemplate();
          }
      }
      
    2. @Conditional

      • 定义:用于根据特定条件决定是否注册 Bean。
      • 作用:实现 Bean 的条件化注册,提高配置的灵活性。
      • 原理:@Conditional注解需要指定一个实现Condition接口的类,Spring 根据该类的matches方法返回的布尔值决定是否注册 Bean。
      • 代码示例如下:
      @Configuration
      public class ConditionalConfig {
          @Bean
          @Conditional(WindowsCondition.class)
          public OSInfo windowsOSInfo() {
              return new OSInfo("Windows");
          }
      
          @Bean
          @Conditional(LinuxCondition.class)
          public OSInfo linuxOSInfo() {
              return new OSInfo("Linux");
          }
      }
      

            以上就是 SpringBoot 中常用注解的下篇内容。这些注解覆盖了请求处理、响应处理、事务管理、配置、AOP 等多个方面,掌握它们能极大地提高 SpringBoot 开发效率。在实际开发中,应根据具体业务场景合理选择和使用注解,以写出高效、清晰、易维护的代码。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值