SpringBoot入门

概述

本篇只是对springboot的基本使用的总结,学习视频->Day05-01. 请求响应-概述_哔哩哔哩_bilibili,使用postman进行调试。

请求

此处的请求含义:后端接收来自浏览器端的请求指令,进行解析

简单参数

请求:

GET指令:http://localhost:8080/simpleParam?name=miku&age=16

POST指令:http://localhost:8080/simpleParam请求体:name=Miku&age=16

Java代码:

原始方式:

1
2
3
4
5
6
7
8
9
10
//在原始的Web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取
@RequestMapping("/simpleParam")
public String simpleRequest(HttpServletRequest request) {
String name = request.getParameter("name");//需要与请求参数的key保持一致
String ageStr = request.getParameter("age");//需要与请求参数的key保持一致
int age = Integer.parseInt(ageStr);
System.out.println("Name: " + name + ", Age: " + age);
return "OK";
}
//繁琐,并且需要进行手动类型转换

SpringBoot方式:

简单参数,参数名与形参列表名相同,定义形参即可接收参数

1
2
3
4
5
@RequestMapping("/simpleParam")
public String simpleRequest(int age,String name) {
System.out.println(name + ":" + age);
return "OK";
}

如果形参名和请求参数名不一致,可以使用@RequestParam进行映射

1
2
3
4
5
@RequestMapping("/simpleParam")
public String simpleRequest(int age,@RequestParam(name="name",required = true) String username) {
System.out.println(username + ":" + age);
return "OK";
}

注解@RequestParam中有两个属性,一个是重定向,一个是required属性,第二个参数如果不写默认为true,即参数是必须的,如果缺少该参数会报400的状态码,表明客户端请求错误。

实体参数

简单实体对象,请求参数名与形参对象属性名相同,定义POJO接收即可

请求:http://localhost:8080/simplePojo?name=miku&age=16

1
2
3
4
5
@RequestMapping("/simplePojo")
public String simpleRequest(User user) {
System.out.println(user);
return "OK";
}

需要创建User对象,声明相应属性、getset方法、toString方法

复杂实体对象,请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

请求:http://localhost:8080/complexPojoname=miku&age=16&address.city=Tokyo&address.country=Japan

1
2
3
4
5
@RequestMapping("/complexPojo")
public String simpleRequest(User1 user) {
System.out.println(user);
return "OK";
}

数组参数

请求参数名与形参数组名相同且请求参数为多个,定义数组类型形参即可接收参数

请求:http://localhost:8080/arrayParam?friend=Miku&friend=Kurumi&friend=Marin

1
2
3
4
5
6
7
@RequestMapping("/arrayParam")
public String simpleRequest(String[] friend) {
for(String f : friend) {
System.out.println(f);
}
return "OK";
}

集合参数

请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系

请求:http://localhost:8080/arrayParam?friend=Miku&friend=Kurumi&friend=Marin

1
2
3
4
5
6
7
8
@RequestMapping("/listParam")
public String simpleRequest(@RequestParam List<String> friend) {
Iterator<String> iterator = friend.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
return "OK";
}

日期参数

使用@DateTimeFormat注解完成日期参数格式转换

请求:http://localhost:8080/dateParam?updateTime=2025-06-03 17:47:55

1
2
3
4
5
@RequestMapping("/dateParam")
public String dateRequest(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
System.out.println("Update Time: " + updateTime);
return "OK";
}

json参数

json参数根据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBodt标识

请求:

请求行http://localhost:8080/jsonParam

请求体

1
2
3
4
5
6
7
8
{
"name":"Miku",
"age":16,
"address":{
"country":"Japan",
"city":"Tokyo"
}
}
1
2
3
4
5
@RequestMapping("/jsonParam")
public String jsonRequest(@RequestBody User1 user) {
System.out.println("User: " + user);
return "OK";
}

路径参数

通过请求URL直接传递该参数,使用{…}来表示该路径参数,需要使用@PathVariable获取路径参数

请求:http://localhost:8080/path/1

1
2
3
4
5
@RequestMapping("/path/{id}")
public String pathParam(@PathVariable Integer id) {
System.out.println("ID: " + id);
return "OK";
}

获取多个路径参数:

请求:http://localhost:8080/path/1/Miku

1
2
3
4
5
@RequestMapping("/path/{id}/{name}")
public String pathParam(@PathVariable Integer id,@PathVariable String name) {
System.out.println("ID: " + id + ", Name: " + name);
return "OK";
}

响应

@Response注解

位置:Controller类上或者方法上

作用:将方法返回值直接响应,若返回值是实体对象/集合,转为JSON格式响应

统一响应结果:

Result(code、msg、data)

分层解耦

三层架构

三层架构包括控制层(Controller)、业务逻辑层(Service)、数据访问层(Dao)

graph LR
浏览器==>Controller
Controller==>Service
Service==>Dao
  • Controller:控制层,接收前端发送的请求,(对请求进行处理),进行响应

  • Service:业务逻辑层,处理具体的业务逻辑

  • Dao:数据访问层(持久层),负责数据的访问操作

介绍完三层架构之后,那么就该谈到它的实现了,如果说只是用程序进行控制,那么就很容易会产生耦合,使得代码的拓展性大大降低。好在Spring给我们提供了IOC,我们可以通过Spring容器来对 Bean对象 进行控制,这样不同层的代码就相互独立起来。

IOC(控制反转)

设计到四个注解:

@Component、@Controller、@Service、@Repository

后边三个都是@Component的衍生注解,实际功能与@Component类似,但是推荐使用后三个,当某一个部分不属于后三个中的任何一个的时候再使用@Component。

  • 声明bean的时候,可以使用value属性指定bean的名字,如果没用,则默认为类名的首字母小写形式
  • 不只是建议:在使用springboot集成的web开发中,声明控制器bean只能用@Controller

Bean组件扫描

上边的四大注解要想生效,还必须经过Bean组件扫描,使用的是@ComponentScan注解,该注解在启动类的声明注解中已经包含,默认范围是启动类所在包及其子包。可以通过在启动类的注解中加上重写的@ComponentScan来更改扫描路径,但是不推荐更改。

DI(依赖注入)

Spring中,依赖注入是通过@Autowired注解完成的,最简单的的情况下,就在Controller声明Service对象处或者Service声明Dao对象处加上@Autowired注解,就会根据类型自动匹配

那么如果有多个业务逻辑呢?(以业务逻辑为例)

如果不进行处理,就会存在多个业务逻辑可供选择,直接就会报错。

有三个注解可以用来解决这个问题

  • @Primary:见名知意,就是给不同的Service提供一个优先级,那么就会优先注入Primary的依赖
  • @Qualified:通过在@Autowired的地方加这个注解,通过其value属性指定相应的Service
  • @Resource:不使用@Autowired注解,使用名字进行注入,使用@Resource(name = "empServiceA")进行注入,因为是根据名字进行注入的,也就不存在冲突