当前位置: 首页 > news >正文

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 {@PostMappingpublic 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")@ResponseBodypublic 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 {@GetMappingpublic 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 {@Autowiredprivate OrderRepository orderRepository;@Autowiredprivate InventoryRepository inventoryRepository;@Transactionalpublic 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 {@Beanpublic 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 开发效率。在实际开发中,应根据具体业务场景合理选择和使用注解,以写出高效、清晰、易维护的代码。

    http://www.dtcms.com/a/307673.html

    相关文章:

  1. 嵌入式硬件中瓷片电容的基本原理与详解
  2. WebRTC 多媒体 SDP 示例与解析
  3. 嵌入式硬件学习(十)—— LED驱动+杂项设备驱动
  4. 2025电商CPS分销与推客系统小程序开发:趋势、架构与实战解析
  5. SpringBoot3.x引入Quartz,持久化到MySQL数据库
  6. npm 设置国内镜像源
  7. 中宇联:以“智云融合+AI”赋能全栈云MSP服务,深化阿里云生态合作
  8. 【YOLOv1】
  9. 多云场景实战:华为手机 QR 码绑定与 AWS云服务器终端登录全解
  10. 全球SPAD技术发展全景:工艺节点、产能布局与中国突破
  11. 科研快报 |无人机+AI:广东防控基孔热背后的技术革命
  12. 无人机传感器系统架构解析
  13. 了解SQL
  14. HttpServletRequest详细解释
  15. HttpServletRequest 和 HttpServletResponse核心接口区别
  16. UDP_千兆光通信(四)Tri Mode Ethernet MAC ip核
  17. 力扣 hot100 Day61
  18. Mockito:Java单元测试Mock框架
  19. Mac 系统下安装 nvm
  20. 工业园区泵房物联网能耗优化解决方案:打造绿色低碳厂区
  21. 组播 | 不同 VLAN 间数据转发实现逻辑 / 实验
  22. 深入解读OpenTelemetry分布式链路追踪:原理与实践指南
  23. tlias智能学习辅助系统--SpringAOP-基础-核心概念
  24. Cesium 快速入门(一)快速搭建项目
  25. 防火墙安全实验
  26. 10. NAT,代理服务,内网穿透
  27. MLIR TableGen
  28. 软考中级-信息安全工程师-每日一学(1)
  29. 网关冗余技术VRRP的原理与配置
  30. 相亲小程序安全与隐私系统模块搭建