📣前言

  在构建现代Web应用时,RESTful架构风格因其简洁性和高效性而广受青睐。Spring MVC作为Java开发中的主流框架,通过其@GetMapping注解,为开发者提供了一种便捷的方式来处理HTTP GET请求。本文将深入探讨@GetMapping注解的使用方法和内在机制。

  那么,具体如何实现呢?这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!

🌊环境说明

开发工具:IDEA 2021.3 JDK版本: JDK 1.8 Spring Boot版本:2.3.1 RELEASE Maven版本:3.8.2


🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。


🌊摘要

🌊正文

摘要

  @GetMapping是Spring MVC提供的一种用于处理HTTP GET请求的注解。它不仅简化了请求映射的配置,而且提高了代码的可读性和维护性。本文将从基本概念出发,通过实际代码示例和测试用例,全面解析@GetMapping的应用,并探讨其优缺点。

简介

  @GetMapping@RequestMapping注解的特化,专门用于处理HTTP GET请求。使用@GetMapping可以减少配置的复杂性,使得代码更加清晰和易于理解。

源代码解析

  以下是使用@GetMapping注解的一个基本示例:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {

    // 使用@GetMapping注解映射"/items"路径到这个方法
    @GetMapping("/items")
    public String getItems() {
        return "List of items";
    }
}

  在这个示例中,@GetMapping注解被用于MyRestController类的getItems方法上,将HTTP GET请求映射到该方法。

  并附上相关注解源码截图,这里我就简单给附上,感兴趣的同学可以扒扒源码。

  接着我将对上述代码进行详细的一个逐句解读,希望能够帮助到同学们,能更快的掌握学习。

代码解析

  上述代码演示了如何在Spring MVC框架中使用@RestController@GetMapping注解来创建一个简单的RESTful风格的Web服务。下面是对代码的详细解析:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

// 1. 使用@RestController注解声明这是一个控制器,并且所有的方法返回值都将作为HTTP响应的正文
@RestController
public class MyRestController {

    // 2. 使用@GetMapping注解映射HTTP GET请求到/items路径到getItems方法
    @GetMapping("/items")
    public String getItems() {
        // 3. getItems方法将返回一个字符串,这个字符串将直接作为HTTP响应的正文返回
        return "List of items";
    }
}
1. 控制器声明
  • @RestController:这个注解是@Controller@ResponseBody注解的组合,它表明MyRestController类是一个控制器,并且其所有方法的返回值都将被自动写入HTTP响应正文,而不是解析为视图。
2. 请求映射
  • @GetMapping("/items"):这个注解是@RequestMapping注解的特化,专门用于处理HTTP GET请求。它将URL路径/items映射到getItems方法上,这意味着当客户端发起到/items的GET请求时,getItems方法将被调用。
3. 方法实现
  • public String getItems():这是一个公共方法,它没有参数并返回一个String类型的值。在RESTful Web服务中,这个返回值将作为HTTP响应的正文发送给客户端。
4. 返回值
  • return "List of items";:这行代码返回一个简单的字符串,表示对/items路径的GET请求的响应。在实际应用中,这里可能会返回一个更复杂的对象,例如JSON数组或XML文档。

应用场景

  MyRestController类可以用于一个简单的电子商务应用,其中/items路径用于获取商品列表。客户端通过发送GET请求到这个路径,可以接收到商品信息的文本描述。

优缺点

  • 优点

    • 简化配置:@GetMapping使得映射HTTP GET请求变得简单直接。
    • 增强可读性:明确表明方法响应GET请求,提高代码可读性。
    • 易于测试:GET请求容易模拟和测试。
  • 缺点

    • 限制性:只能用于GET请求,对于需要处理其他类型请求的方法不适用。
    • 可能的误解:初学者可能会误认为所有返回值都会被自动转换为JSON,实际上需要结合@ResponseBody@RestController使用。

应用场景案例

  这里我假设一个场景,如下:考虑一个电子商务网站,需要提供一个API端点来获取商品列表,那么我们应如何正确使用该注解进行代码实现呢?示例代码演示如下,仅供参考:

import org.springframework.web.bind.annotation.*;

@RestController
public class ProductController {

    // 获取商品列表
    @GetMapping("/products")
    public List<Product> listProducts() {
        // 模拟查询数据库获取商品列表
        return Arrays.asList(new Product("Product1"), new Product("Product2"));
    }
}

  实际运用场景展示如下:

  其实使用上非常简单,但如何要知其原理,还是需要花点时间。如下我依旧是对代码进行一个彻底的解读,辅助大家学习。

代码解析

  这段代码演示了如何在Spring MVC框架中使用@RestController@GetMapping注解来创建一个RESTful风格的商品控制器。以下是对代码的详细解析:

import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;

// 1. 使用@RestController注解声明这是一个控制器,并且所有的方法返回值都将作为HTTP响应的正文
@RestController
public class ProductController {

    // 2. 使用@GetMapping注解映射HTTP GET请求到/products路径到listProducts方法
    @GetMapping("/products")
    public List<Product> listProducts() {
        // 3. 模拟数据库查询操作,返回商品列表
        // 这里使用Arrays.asList创建了一个包含两个Product对象的列表作为示例
        return Arrays.asList(new Product("Product1"), new Product("Product2"));
    }
}
1. 控制器声明
  • @RestController:这个注解表明ProductController类是一个控制器,它的所有方法的返回值将直接作为HTTP响应的正文返回。这通常用于RESTful Web服务,其中响应正文通常是JSON或XML格式的数据。
2. 请求映射
  • @GetMapping("/products"):这个注解将HTTP GET请求映射到/products路径。当客户端发起到这个路径的GET请求时,listProducts方法将被调用。
3. 方法实现
  • public List<Product> listProducts():这是一个公共方法,返回一个List<Product>类型的值。这里Product是一个假设的商品实体类,列表中包含了两个商品实例。
4. 模拟数据库查询
  • Arrays.asList(new Product("Product1"), new Product("Product2")):这行代码模拟了从数据库查询商品列表的操作。在实际应用中,这里可能会有对数据库的查询操作,并返回查询结果。

优缺点分析

优点

  • 语义清晰:专门用于GET请求,代码意图明确。
  • 简化配置:减少了使用@RequestMapping时需要指定HTTP方法的配置。
  • 易于测试:GET请求的测试相对简单,易于编写自动化测试。

缺点

  • 限制性:仅适用于GET请求,对于需要处理其他类型请求的场景不适用。
  • 可能的误解:初学者可能会误以为@GetMapping会自动将返回值序列化为JSON,实际上需要结合@ResponseBody@RestController使用。

类代码方法介绍

  @GetMapping通常与@RestController注解结合使用,后者将类中的所有方法返回值作为HTTP响应正文返回。此外,@GetMapping可以与@RequestParam@PathVariable等注解结合,以获取请求中的参数。

测试用例

以下是使用JUnit和Spring Boot测试模块编写的测试用例:

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

@SpringBootTest
public class ProductControllerTest {

    private MockMvc mockMvc;

    // 省略了MockMvc的初始化代码

    // 测试获取商品列表的GET请求
    public void testListProducts() throws Exception {
        mockMvc.perform(get("/products"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(2))); // 假设返回的是JSON数组
    }
}

  实际运用场景展示如下,仅供参考:   其实使用上非常简单,但如何要知其原理,还是需要花点时间。如下我依旧是对代码进行一个彻底的解读,辅助大家学习。

代码解析

  这段代码是一个Spring Boot应用的集成测试类,它使用@SpringBootTest来加载应用上下文,并使用MockMvc来模拟HTTP请求并验证响应。以下是对代码的详细解析:

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;

// 1. 使用@SpringBootTest注解加载Spring Boot应用的测试环境
@SpringBootTest
public class ProductControllerTest {

    // 2. 私有成员变量,用于模拟HTTP请求和响应
    private MockMvc mockMvc;

    // 测试方法,用于验证获取商品列表的GET请求
    public void testListProducts() throws Exception {
        // 3. 使用MockMvc的perform方法模拟对"/products"路径的GET请求
        mockMvc.perform(get("/products"))
                // 4. 使用andExpect方法链来断言响应的状态码为200(HTTP OK)
                .andExpect(status().isOk())
                // 5. 使用jsonPath断言来验证响应正文是一个包含2个元素的JSON数组
                .andExpect(jsonPath("$", hasSize(2))); // 假设返回的JSON数组长度为2
    }
}
1. 测试类声明
  • @SpringBootTest:这个注解告诉Spring Boot测试框架,这是一个集成测试,将会加载完整的Spring应用上下文,包括所有的自动配置和Bean。
2. MockMvc成员变量
  • private MockMvc mockMvc;:这个成员变量用于创建和配置MockMvc实例,它是Spring MVC测试框架的一部分,用于模拟HTTP请求和响应。
3. 测试方法
  • public void testListProducts() throws Exception:这是一个测试方法,用于验证ProductController控制器的listProducts方法是否按预期工作。
4. 模拟GET请求
  • mockMvc.perform(get("/products")):这行代码使用MockMvc的perform方法来模拟对/products路径的GET请求。
5. 断言响应
  • .andExpect(status().isOk()):这个断言检查响应的状态码是否为200,即HTTP OK状态,表示请求成功。

  • .andExpect(jsonPath("$", hasSize(2))):这个断言使用jsonPath表达式来检查响应正文中的JSON数组长度是否为2。这假设listProducts方法返回的是一个包含两个商品的JSON数组。

注意事项

  • 在实际的测试类中,需要使用@Autowired注解或其他Spring测试框架支持的注入方式来初始化mockMvc成员变量。
  • 测试方法通常会使用@Test注解,这样JUnit运行器才能识别并执行它们。
  • 断言不仅仅是检查状态码和JSON数组长度,还可以根据需要检查响应正文的具体内容,例如使用jsonPath断言来检查数组中具体元素的值。

测试用例完善

  为了使测试用例更加完整,我们通常会添加@Autowired注解来自动装配MockMvc,并使用@BeforeEach注解来初始化测试环境,如下是对上述测试案例的一个完事补充,仅供参考:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig;
import org.springframework.test.web.servlet.MockMvc;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

@SpringJUnitWebConfig
@SpringBootTest
public class ProductControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @BeforeEach
    public void setUp() {
        // 这里可以添加一些测试前的初始化代码
    }

    @Test
    public void testListProducts() throws Exception {
        // 测试代码如上所示
    }
}

  使用@BeforeEach注解的setUp方法可以在每个测试方法执行前运行,用于准备测试环境。此外,@SpringJUnitWebConfig注解可以用来指定自定义的测试配置,如果需要的话。

全文小结

  通过本文的学习,我们深入了解了@GetMapping注解的使用方法和应用场景。从基础的映射到结合其他注解的高级用法,@GetMapping都显示出其在RESTful Web服务开发中的重要性。

总结

  @GetMapping是Spring MVC中处理HTTP GET请求的强大工具。它的使用简化了请求映射的配置,提高了代码的可读性和维护性。虽然它有一些限制,但在适合的场景下,@GetMapping是一个高效且易于使用的工具。

... ...

  ok,以上就是我这期的全部内容啦,若想学习更多,你可以持续关注我,我会把这个多线程篇系统性的更新,保证每篇都是实打实的项目实战经验所撰。只要你每天学习一个奇淫小知识,日积月累下去,你一定能成为别人眼中的大佬的!功不唐捐,久久为功!

「赠人玫瑰,手留余香」,咱们下期拜拜~~

🌊热文推荐

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

[Spring Boot进阶(01):使用Spring Boot和Redis轻松实现高性能、高可用的缓存服务。]

[Spring Boot进阶(02):防止程序员疯狂 Debug:快速掌握 Validation 参数校验技巧,让你的代码健康起来!]

[Spring Boot进阶(03):【实战教程】MyBatis-Plus秒级实现字段自动填充,让你的代码更优雅!]

[Spring Boot进阶(04):震惊!使用MyBatis-Plus,快速实现自定义SQL分页功能!]

[Spring Boot进阶(05):Spring Boot与RabbitMQ完美融合,打造高效消息队列服务!]

[Spring Boot进阶(06):【超详细】Windows10搭建RabbitMQ Server服务端,让你轻松实现消息队列管理!]

[Spring Boot进阶(07):如何使用EasyPoi实现Java中Excel的导入导出?完整教程请收藏,让你的Excel操作更高效!]

[Spring Boot进阶(08):使用EasyPoi实现Excel/Word携带图片导出,打造精美的报表]

[Spring Boot进阶(09):用EasyPoi实现Excel多sheet导入导出,轻松管理海量数据!]

[Spring Boot进阶(10):「从Excel到PDF,EasyPoi助你一键完美转换!」]

[Spring Boot进阶(11):实现纯文本转成.csv格式文件,Spring Boot轻松搞定!附完整代码]

[Spring Boot进阶(12):如何快速获取Excel文件中的Sheet页数量?Spring Boot教程带你一步步实现]

[Spring Boot进阶(13):如何优雅获取@ApiModelProperty(value = “序列号“, name = “uuid“)中的value值,附源码]

[Spring Boot进阶(14):Spring Boot高级应用:手把手教你连接数据库并获取指定表结构!一文教会你]

[Spring Boot进阶(15):用Spring Boot实现动态数据库分页查询表结构信息!]

[Spring Boot进阶(16):使用Redis实现手机验证码功能,让你的用户注册更加便捷!]

[Spring Boot进阶(17):Swagger2高级配置:定制header请求头等参数]

[Spring Boot进阶(18):轻松管理定时任务!Spring Boot@Scheduled让你事半功倍]

[Spring Boot进阶(19):探索ElasticSearch:如何利用Spring Boot轻松实现高效数据搜索与分析]

[Spring Boot进阶(20):「打造高性能Web应用」——使用Jetty容器配置Spring Boot]

[Spring Boot进阶(21):优化Spring Boot应用性能,使用Undertow容器提升响应速度]

[Spring Boot进阶(22):决战容器之巅:Tomcat vs Undertow!性能对比分析揭秘最佳选择!]

[Spring Boot进阶(23):终极解决方案!教你实现高效文件上传!]

[Spring Boot进阶(24):秒传!快速实现高效多文件上传的最佳解决方案]

[Spring Boot进阶(25):如何写出高效的文件上传单元测试?让你的测试更智能更高效!]

[Spring Boot进阶(26):从小白到高手,掌握Mybatis中resultType和resultMap的秘密!]

[Spring Boot进阶(27):Spring Boot进阶(27):Kafka大显身手,快速构建消息驱动应用!(环境搭建+演示)]

[Spring Boot进阶(28):如何让Spring Boot应用在Linux中以后台服务方式启动,并实现滚动日志查看及保存至实体文件?]

[Spring Boot进阶(29):如何正确使用Spring Boot注解@PathVariable、@RequestParam和@RequestBody: Postman演示教程]

[Spring Boot进阶(30):@RestController与@Controller的区别及使用场景详解,附带精彩实战演示]

... ...

  若想系统性的从0到1的入门进阶学习,可以参考这篇专栏总结《2024最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》本专栏致力打造全网最硬核 Spring Boot 学习及进阶SpringBoot 系列教学内容,🚀均为全网独家首发,致力打造精品硬核干货,专栏永持续更新。欢迎大家订阅学习。一分耕耘一份收获!

  如果想快速定位学习,可以看这篇【一站式教程导航】,你想学习的都被收录系统整理在内,以最快的速度投入并学习掌握!!你值得拥有。

  在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点!投资自己,性价比永远最高,都这么说了,你还不赶紧来白嫖??

  本文涉及所有源代码,均已上传至GitHub开源,供同学们一对一参考 GitHub传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

📣文末

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。