Spring Boot 从零入门请求响应、三层架构与 IOC/DI 实践总结文章目录Spring Boot 从零入门请求响应、三层架构与 IOC/DI 实践总结1. 项目搭建与第一个接口2. 请求响应参数接收全解析2.1 哪些参数必须掌握2.2 不用 Postman如何高效测试2.3 常见参数示例代码4. 分层解耦三层架构设计4.1 为什么需要分层4.2 标准三层职责5. IoC DI彻底告别 new 关键字5.1 IoC 与 DI 概念5.2 注解驱动的改造步骤5.3 为什么推荐构造器注入6. 统一响应格式Result 封装7. 总结和最后的话1. 项目搭建与第一个接口使用 IDEA 的 Spring Initializr 创建项目依赖仅选择Spring Web。启动类HttpStuApplication自动生成。在controller包下创建HelloControllerRestControllerpublicclassHelloController{RequestMapping(/hello)publicStringsayHello(){returnHello, 请求响应学习开始;}}运行后浏览器访问http://localhost:8080/hello输出文本 —— 标志着环境验证通过。2. 请求响应参数接收全解析2.1 哪些参数必须掌握优先级参数类型注解使用频率 必须掌握简单参数RequestParam可省略每天 必须掌握路径参数PathVariable每天 必须掌握JSON 参数RequestBody每天✅ 常用实体参数无注解自动封装经常⚠️ 了解即可日期参数DateTimeFormat偶尔⚠️ 了解即可数组/集合参数RequestParamList偶尔2.2 不用 Postman如何高效测试IDEA 内置 HTTP Client在项目根目录re新建test.http文件写入请求点击绿色箭头即可发送。示例JSON 参数测试POST http://localhost:8080/json Content-Type: application/json { name: 张三, age: 18 }这种方法零安装、可保存、支持团队共享非常适合学习阶段。2.3 常见参数示例代码RestControllerpublicclassParamController{// 简单参数GetMapping(/simple)publicStringsimple(RequestParamStringname,Integerage){...}// 路径参数GetMapping(/path/{id})publicStringpath(PathVariableIntegerid){...}// JSON 参数PostMapping(/json)publicUserjson(RequestBodyUseruser){...}// 实体参数自动封装GetMapping(/user)publicUseruser(Useruser){returnuser;}}注意返回类型为String时 Spring 输出纯文本返回对象/集合/Map 时自动转为 JSON。4. 分层解耦三层架构设计4.1 为什么需要分层最初将所有代码写在 Controller 中导致重复代码多个接口都要查用户业务逻辑和请求处理混在一起更换数据源例如从 Map 改为 MySQL需要改动多处4.2 标准三层职责层级包名示例职责对象类型表示层controller接收请求、参数校验、返回响应XxxController业务层service业务逻辑、事务管理、调用 DAOXxxServiceXxxServiceImpl数据访问层dao/repository数据库 CRUD、模拟数据XxxDaoXxxDaoImpl调用链Controller→Service→DAO→ 数据 → 原路返回。5. IoC DI彻底告别new关键字5.1 IoC 与 DI 概念概念含义比喻IoC(控制反转)对象的创建控制权从程序员反转到 Spring 容器你不必自己new告诉容器“我需要什么”即可DI(依赖注入)容器在创建对象时自动将依赖的对象赋值给字段容器帮你“接线”5.2 注解驱动的改造步骤原代码耦合publicclassUserServiceImplimplementsUserService{privateUserDaouserDaonewUserDaoImpl();// 主动 new}改造后解耦ServicepublicclassUserServiceImplimplementsUserService{privatefinalUserDaouserDao;Autowired// Spring 4.3 单构造器可省略publicUserServiceImpl(UserDaouserDao){this.userDaouserDao;}}同时为UserDaoImpl添加Repository为UserController中注入UserService。5.3 为什么推荐构造器注入注入方式代码量不可变性 (final)单元测试循环依赖检测推荐度字段注入最少❌困难需反射容器内可能掩盖❌ 不推荐Setter 注入中等❌一般无⚠️ 可选构造器注入稍多✅简单new传参启动时报错✅强烈推荐构造器注入让依赖显式化、对象不可变、测试更友好。6. 统一响应格式Result 封装企业级接口通常不直接返回实体对象而是返回统一结构的 JSON方便前端全局拦截。标准结构{code:1,msg:success,data:{name:张三,age:18}}实现创建utils/Result类publicclassResult{privateIntegercode;privateStringmsg;privateObjectdata;publicstaticResultsuccess(Objectdata){ResultrnewResult();r.setCode(1);r.setMsg(success);r.setData(data);returnr;}publicstaticResulterror(Stringmsg){ResultrnewResult();r.setCode(0);r.setMsg(msg);returnr;}// getter / setter 必须存在}Controller 使用GetMapping(/user/{id})publicResultgetUser(PathVariableIntegerid){UseruseruserService.getUserById(id);if(usernull){returnResult.error(用户不存在);}returnResult.success(user);}注意Result 类必须有 getter/setter否则 Spring 无法将字段序列化为 JSON。7. 总结和最后的话主题关键点请求响应RequestParam、PathVariable、RequestBody测试用.http三层架构Controller请求/响应、Service业务、DAO数据面向接口编程接口定义契约实现类可替换上层只依赖接口IoC/DIService/RepositoryAutowired推荐构造器注入统一响应Result封装 code/msg/data提供静态工厂方法
Spring Boot 从零入门:请求响应、三层架构与 IOC/DI 实践总结
Spring Boot 从零入门请求响应、三层架构与 IOC/DI 实践总结文章目录Spring Boot 从零入门请求响应、三层架构与 IOC/DI 实践总结1. 项目搭建与第一个接口2. 请求响应参数接收全解析2.1 哪些参数必须掌握2.2 不用 Postman如何高效测试2.3 常见参数示例代码4. 分层解耦三层架构设计4.1 为什么需要分层4.2 标准三层职责5. IoC DI彻底告别 new 关键字5.1 IoC 与 DI 概念5.2 注解驱动的改造步骤5.3 为什么推荐构造器注入6. 统一响应格式Result 封装7. 总结和最后的话1. 项目搭建与第一个接口使用 IDEA 的 Spring Initializr 创建项目依赖仅选择Spring Web。启动类HttpStuApplication自动生成。在controller包下创建HelloControllerRestControllerpublicclassHelloController{RequestMapping(/hello)publicStringsayHello(){returnHello, 请求响应学习开始;}}运行后浏览器访问http://localhost:8080/hello输出文本 —— 标志着环境验证通过。2. 请求响应参数接收全解析2.1 哪些参数必须掌握优先级参数类型注解使用频率 必须掌握简单参数RequestParam可省略每天 必须掌握路径参数PathVariable每天 必须掌握JSON 参数RequestBody每天✅ 常用实体参数无注解自动封装经常⚠️ 了解即可日期参数DateTimeFormat偶尔⚠️ 了解即可数组/集合参数RequestParamList偶尔2.2 不用 Postman如何高效测试IDEA 内置 HTTP Client在项目根目录re新建test.http文件写入请求点击绿色箭头即可发送。示例JSON 参数测试POST http://localhost:8080/json Content-Type: application/json { name: 张三, age: 18 }这种方法零安装、可保存、支持团队共享非常适合学习阶段。2.3 常见参数示例代码RestControllerpublicclassParamController{// 简单参数GetMapping(/simple)publicStringsimple(RequestParamStringname,Integerage){...}// 路径参数GetMapping(/path/{id})publicStringpath(PathVariableIntegerid){...}// JSON 参数PostMapping(/json)publicUserjson(RequestBodyUseruser){...}// 实体参数自动封装GetMapping(/user)publicUseruser(Useruser){returnuser;}}注意返回类型为String时 Spring 输出纯文本返回对象/集合/Map 时自动转为 JSON。4. 分层解耦三层架构设计4.1 为什么需要分层最初将所有代码写在 Controller 中导致重复代码多个接口都要查用户业务逻辑和请求处理混在一起更换数据源例如从 Map 改为 MySQL需要改动多处4.2 标准三层职责层级包名示例职责对象类型表示层controller接收请求、参数校验、返回响应XxxController业务层service业务逻辑、事务管理、调用 DAOXxxServiceXxxServiceImpl数据访问层dao/repository数据库 CRUD、模拟数据XxxDaoXxxDaoImpl调用链Controller→Service→DAO→ 数据 → 原路返回。5. IoC DI彻底告别new关键字5.1 IoC 与 DI 概念概念含义比喻IoC(控制反转)对象的创建控制权从程序员反转到 Spring 容器你不必自己new告诉容器“我需要什么”即可DI(依赖注入)容器在创建对象时自动将依赖的对象赋值给字段容器帮你“接线”5.2 注解驱动的改造步骤原代码耦合publicclassUserServiceImplimplementsUserService{privateUserDaouserDaonewUserDaoImpl();// 主动 new}改造后解耦ServicepublicclassUserServiceImplimplementsUserService{privatefinalUserDaouserDao;Autowired// Spring 4.3 单构造器可省略publicUserServiceImpl(UserDaouserDao){this.userDaouserDao;}}同时为UserDaoImpl添加Repository为UserController中注入UserService。5.3 为什么推荐构造器注入注入方式代码量不可变性 (final)单元测试循环依赖检测推荐度字段注入最少❌困难需反射容器内可能掩盖❌ 不推荐Setter 注入中等❌一般无⚠️ 可选构造器注入稍多✅简单new传参启动时报错✅强烈推荐构造器注入让依赖显式化、对象不可变、测试更友好。6. 统一响应格式Result 封装企业级接口通常不直接返回实体对象而是返回统一结构的 JSON方便前端全局拦截。标准结构{code:1,msg:success,data:{name:张三,age:18}}实现创建utils/Result类publicclassResult{privateIntegercode;privateStringmsg;privateObjectdata;publicstaticResultsuccess(Objectdata){ResultrnewResult();r.setCode(1);r.setMsg(success);r.setData(data);returnr;}publicstaticResulterror(Stringmsg){ResultrnewResult();r.setCode(0);r.setMsg(msg);returnr;}// getter / setter 必须存在}Controller 使用GetMapping(/user/{id})publicResultgetUser(PathVariableIntegerid){UseruseruserService.getUserById(id);if(usernull){returnResult.error(用户不存在);}returnResult.success(user);}注意Result 类必须有 getter/setter否则 Spring 无法将字段序列化为 JSON。7. 总结和最后的话主题关键点请求响应RequestParam、PathVariable、RequestBody测试用.http三层架构Controller请求/响应、Service业务、DAO数据面向接口编程接口定义契约实现类可替换上层只依赖接口IoC/DIService/RepositoryAutowired推荐构造器注入统一响应Result封装 code/msg/data提供静态工厂方法