SpringBoot入门
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 | //在原始的Web程序中,获取请求参数,需要通过HttpServletRequest对象手动获取 |
SpringBoot方式:
简单参数,参数名与形参列表名相同,定义形参即可接收参数
1 |
|
如果形参名和请求参数名不一致,可以使用@RequestParam进行映射
1 |
|
注解@RequestParam中有两个属性,一个是重定向,一个是required属性,第二个参数如果不写默认为true,即参数是必须的,如果缺少该参数会报400的状态码,表明客户端请求错误。
实体参数
简单实体对象,请求参数名与形参对象属性名相同,定义POJO接收即可
请求:http://localhost:8080/simplePojo?name=miku&age=16
1 |
|
需要创建User对象,声明相应属性、getset方法、toString方法
复杂实体对象,请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数
请求:http://localhost:8080/complexPojoname=miku&age=16&address.city=Tokyo&address.country=Japan
1 |
|
数组参数
请求参数名与形参数组名相同且请求参数为多个,定义数组类型形参即可接收参数
请求:http://localhost:8080/arrayParam?friend=Miku&friend=Kurumi&friend=Marin
1 |
|
集合参数
请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
请求:http://localhost:8080/arrayParam?friend=Miku&friend=Kurumi&friend=Marin
1 |
|
日期参数
使用@DateTimeFormat注解完成日期参数格式转换
请求:http://localhost:8080/dateParam?updateTime=2025-06-03 17:47:55
1 |
|
json参数
json参数根据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBodt标识
请求:
请求行http://localhost:8080/jsonParam
请求体
1 | { |
1 |
|
路径参数
通过请求URL直接传递该参数,使用{…}来表示该路径参数,需要使用@PathVariable获取路径参数
请求:http://localhost:8080/path/1
1 |
|
获取多个路径参数:
请求:http://localhost:8080/path/1/Miku
1 |
|
响应
@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")
进行注入,因为是根据名字进行注入的,也就不存在冲突