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

Spring Boot——从零开始写一个接口:项目构建 + 分层实战

目录

  • 🌵项目构建
  • 🌵依赖注入与Spring容器(概论)
  • 🌵Controller、Service 层讲解与实践
    • 一、为什么分层?——MVC架构简述
    • 二、Controller层:请求的入口
    • 三、Service层:业务逻辑的容器
    • 🌷动手实践:完成Hello接口
      • 1.创建Spring Boot项目
      • 2.编写Service层
      • 3.编写Controller层
      • 4.启动与测试
      • 5.拓展练习
  • 🌵Mapper层:接入MySQL,持久化存储

适用于刚接触 Spring Boot 的 Java 开发者。


🌵项目构建

法一: 使用 Spring Initializr 创建项目
访问https://start.spring.io
“动手实践”部分用的这个方法。

法二: 通过maven
我于2025-10-30参照以下文章创建成功:
使用idea社区版开发SpringBoot应用的流程

以下为我自己构建过程中的注意点:

  1. 修改pom.xml(复制以下即可):
    可在官网搜索添加依赖:
    Maven Central官网:https://central.sonatype.com/
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>maven-springboot-test</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>maven-springboot-test</name><url>http://maven.apache.org</url><!--1、spring-boot-starter-parent自动引入springboot中最基础的组件,所有springboot项目都要依赖它进行构建--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</version></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--2、引入springboot依赖,spring-boot-starter-web表示在项目中增加支持javaweb的功能,版本信息已经在parent中定义--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
</project>
  1. 可使用SpringBoot DevTools模块
    该模块的目的是在使用Spring Boot应用程序时尝试并缩短开发时间。 Spring Boot DevTools接受更改并重新启动应用程序。
  • 在pom.xml文件中添加依赖项
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>
  • 修改设置:
    ①文件->搜索“编译器”->勾选“自动构建项目”
    ②文件->高级设置->找到“编译器”->勾选第一个复选框“即使开发的应用程序当前正在运行,也允许自动make启动”

步骤1

步骤2
3. 至此,src目录结构如下:

src/
├── main/
│   ├── java/
│   │   └── com.example.demo/
│   │       └── DemoApplication.java
│   └── resources/
│       ├── application.properties
└── test/

🌵依赖注入与Spring容器(概论)

  • 这部分内容不详尽,只适合当个流程看一看。

不是任何时候都需要套Spring bean或者拎出接口。
"A guideline, not a rule! "
"It`s a tool, not a rule! "

  • 以下为本人学习过程中按序遇到的概念,不做详细阐述:
    提取接口
    将依赖项注入类
    开闭原则
    ||
    ||
    V

  • 由依赖管理的复杂 引出spring
    1.Spring 知道有哪些类可以创建
    2.Spring 能自动创建并管理这些对象
    这就是 IOC(Inversion of Control)容器 的作用!
    ||
    ||
    V

  • IOC容器
    IOC = 控制反转(Inversion of Control)
    传统方式:我们手动 new UserService() → 控制权在程序员手中
    Spring 方式:Spring 帮我们创建对象,并按需注入 → 控制权交给框架
    💡 所以叫“控制反转”——把对象的创建权“反转”给容器。

  • Spring 启动时会:
    扫描所有带 @Component、@Service、@Controller 等注解的类
    创建实例,放入 IOC 容器
    当你需要时,通过 @Autowired 自动注入

@autowired

  • 是 Spring 框架提供的一个注解(Annotation),用于自动注入(Auto Wire)依赖对象。
    简单来说:
    “请 Spring 帮我找到合适的对象,并把它赋值给我这个字段。”
  • 作用举例:
    假设你有一个服务类 UserService,另一个类 UserController 需要用到它:
@Service
public class UserService {public String getUserInfo() {return "用户信息:张三";}
}@RestController
public class UserController {@Autowired  // 👈 关键:让 Spring 自动把 UserService 实例注入进来private UserService userService;@GetMapping("/user")public String getInfo() {return userService.getUserInfo();}
}
  • 没有 @Autowired,你就得手动 new UserService() —— 这样就失去了 Spring 管理对象的能力。
  • 有了 @Autowired,Spring 会在启动时:
    ①找到所有标记为 @Service、@Component 等的类
    ②创建实例并放入 IOC 容器
    ③当发现某个字段加了 @Autowired,就从容器中找匹配的 Bean 并自动赋值

⚠️ 常见错误:

No qualifying bean of type 'org.example.controller.OrderService' available

意为:Spring 根本不知道 OrderService 是一个需要管理的类!
解决方法:使用注解@Service 或 @Component
在这里插入图片描述
在这里插入图片描述


🌵Controller、Service 层讲解与实践

一、为什么分层?——MVC架构简述

在 Web 开发中,我们常采用 MVC(Model-View-Controller) 架构来组织代码。
Spring Boot 项目中,典型的分层包括:

  1. Controller: 处理 HTTP 请求,参数校验,返回响应
  2. Service: 封装业务逻辑,是应用的核心
  3. Repository: 操作数据库(本例不涉及)

二、Controller层:请求的入口

  • 职责
    1.接收客户端请求(GET、POST 等)
    2.解析参数、调用 Service
    3.返回 JSON 或状态码
  • 代码示例📎
@RestController
public class HelloController {@Autowiredprivate HelloService helloService;@GetMapping("/hello")public String sayHello() {return helloService.getHelloMessage();}
}
  • 🔍 注解说明
    1.@RestController:声明这是一个控制器,所有方法返回数据而非视图
    2.@GetMapping:映射 GET 请求到 /hello
    3.@Autowired:自动注入 Service 实例

三、Service层:业务逻辑的容器

  • 职责
    1.封装核心业务逻辑
    2.可被多个 Controller 复用
    3.便于单元测试和事务管理
  • 代码示例📎
@Service
public class HelloService {public String getHelloMessage() {return "Hello, Spring Boot!";}
}
  • 🔍 注解说明:
    @Service:标识这是一个业务服务类,由 Spring 管理

🌷动手实践:完成Hello接口

1.创建Spring Boot项目

  • 使用 start.spring.io创建项目,选择依赖在这里插入图片描述

(解压,可以只留这俩:)
在这里插入图片描述

  • 导入IDE(我的是IDEA)

2.编写Service层

  • 在com/example/demo目录下新建service软件包,并创建HelloService类
  • 编写代码,学习 @Service 注解作用
package com.example.demo.service;import org.springframework.stereotype.Service;@Service  // 关键注解:告诉 Spring 这是一个服务组件
public class HelloService {public String getHelloMessage() {return "Hello, Spring Boot!";}
}
  • 理解关键注解
    @Service:标识这是一个业务服务类,Spring 会在启动时自动将其注册为 Bean,后续可通过 @Autowired 注入使用。
    📌 注意:必须确保该类在主启动类的包或其子包下,否则无法被组件扫描到!(也就是说创建的service包要在主启动类DemoApplication所在包的目录中,跟着我的步骤就没这问题)

3.编写Controller层

  • 在com/example/demo目录下新建controller软件包,并创建HelloController类
  • 编写代码,理解 @RestController 和 @GetMapping
package com.example.demo.controller;import com.example.demo.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController  // 表示这是一个控制器,且所有方法返回 JSON 数据
public class HelloController {@Autowired  // 自动注入 HelloServiceprivate HelloService helloService;@GetMapping("/hello")public String sayHello() {return helloService.getHelloMessage();}
}
  • 注解说明
    在这里插入图片描述

4.启动与测试

  • 运行 DemoApplication.java
  • 访问 http://localhost:8080/hello
    在这里插入图片描述

5.拓展练习

1. 接收路径变量:/hello/{name}
目标:让接口支持个性化问候。

  • 在 HelloController.java 添加以下代码:
 @GetMapping("/hello/{name}")public String sayHelloTo(@PathVariable String name) {return helloService.greet(name);}
  • 在 HelloService.java 添加以下代码:
	public String greet(String name) {return "Hello, "+ name + "!";}
  • ✅ 测试:访问 http://localhost:8080/hello/爱丽丝→ 返回 Hello, 爱丽丝!

  • 💡 @PathVariable:用于获取 URL 路径中的变量。

2. 接收请求参数:/hello?name=xxx
目标:支持通过查询参数传值。

  • 修改HelloController.java中 “/hello” 路径代码(删除或注释,并添加以下代码):
@GetMapping("/hello")public String greetWithParam(@RequestParam(required = false,defaultValue = "Ahhhhh") String name) {return helloService.greet(name);}
  • ✅ 测试:
    http://localhost:8080/hello → 返回 Hello, Ahhhhh!
    http://localhost:8080/hello?name=Java → 返回 Hello, Java! (注意用英文的问号)
  • 💡 @RequestParam:获取 URL 参数,required=false 表示非必填,defaultValue 提供默认值。

3. 返回JSON对象

目标:返回结构化数据,为后续 API 设计打基础。

  • 修改 HelloService.java,添加以下代码
public Map<String, Object> getHelloInfo(){Map<String, Object> result = new HashMap<>();result.put("message", "Hello, Ahhhh!");result.put("timestamp", System.currentTimeMillis());result.put("status",200);return result;}
  • Controller 直接调用即可:
@GetMapping("/hello/json")public Map<String,Object> helloJson(@RequestParam(required = false,defaultValue = "Ahhhhh") String name) {return helloService.getHelloInfo();}
  • ✅ 测试:访问返回的是标准 JSON 格式
    在这里插入图片描述
    4.添加日志输出
    目标:学会记录关键操作。
  • 在HelloService 中添加日志:
// 1. 导入
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;// 2. 创建日志器(放在类里)
private static final Logger log = LoggerFactory.getLogger(当前类名.class);// 3. 打日志
log.info("你想记录的内容,参数用 {} 占位", 参数);
  • ✅ 测试(我放在greet类里)
    在这里插入图片描述
    6.异常处理(俺不做了,你想你做,我后面再学)

🌵Mapper层:接入MySQL,持久化存储

这一部分我们将为Hello接口接入数据库。

1. 添加数据库依赖
可以在Maven Central官网搜索,或直接复制我的到pom.xml中

<!-- MySQL 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version><!--显式指定版本。虽然 Spring Boot 会管理版本,但这里覆盖为 8.0.33(建议升级到 8.0.33+ 以兼容新特性)--></dependency><!-- MyBatis 启动器:集成 MyBatisSpring Boot --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version><!--自动配置 MyBatis 核心组件(SqlSessionFactoryMapper 扫描等)引入后无需手动配置数据源和 MyBatis--></dependency>

2. 配置数据库连接

  • 在Resources包下新建application.yml,配置如下:
spring:datasource:url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8username: root          # 改成你的 MySQL 用户名password: yourpassword  # 改成你的 MySQL 密码(字符串形式)driver-class-name: com.mysql.cj.jdbc.Driver# 可选:开启 SQL 输出,方便调试
logging:level:com.example.demo.mapper: debug  # 打印这个包下的 SQL
  • 登录mysql创建demo_db数据库、user表并插入数据:
-- 登录 MySQL 后执行
CREATE DATABASE IF NOT EXISTS demo_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;USE demo_db;-- 创建 user 表
CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL UNIQUE,message VARCHAR(100)
);-- 插入测试数据
INSERT INTO user (name, message) VALUES 
('小明', 'Hello, 我是小明!'),
('Java', 'Hello, World!'),
('Spring', 'Hello, Spring Boot!');

3.创建实体类User.java

// com.example.demo.model.User
package com.example.demo.model;import lombok.Data;@Data  // 自动生成 getter/setter/toString 等(需要 Lombok)
public class User {private Long id;private String name;private String message;
}

4.第四步:创建 Mapper 接口(Repository 层)

// com.example.demo.mapper.UserMapper
package com.example.demo.mapper;import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface UserMapper {/*** 根据姓名查询用户*/@Select("SELECT id, name, message FROM user WHERE name = #{name}")User findByName(String name);
}

5.启用Mapper扫描

// DemoApplication.java
@SpringBootApplication
@MapperScan("com.example.demo.mapper")  // 👈 扫描所有 Mapper
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

6.修改Service层,调用数据库

// com.example.demo.service.HelloService
@Service
public class HelloService {private static final Logger log = LoggerFactory.getLogger(HelloService.class);@Autowiredprivate UserMapper userMapper;public String greet(String name) {log.info("查询数据库中用户: {}", name);User user = userMapper.findByName(name);if (user != null) {return user.getMessage();} else {return "Hello, " + name + "!";}}
}

7.Controller层保持不变。启动项目。
效果如下:

在这里插入图片描述

在这里插入图片描述
8.完整调用链回顾:

HTTP GET /hello/Bob↓
[HelloController] → 调用 helloService.greet("Bob")↓[HelloService]   → 调用 userMapper.findByName("Bob")↓
[UserMapper]      → 执行 SQL 查询 MySQL↓数据库返回 User 对象↓← 逐层返回消息字符串↓
返回给浏览器
http://www.dtcms.com/a/566205.html

相关文章:

  • 公司网站介绍范文深圳坪山最新消息
  • 做听书网站怎么做行业门户网站方案
  • 价值重估 景气再启 投资人张利明纵论新能源投资策略
  • 网站制作明细报价表杭州新闻
  • 绿幕直播:绿幕怎么选择?灯光怎么布置?相机怎么设置?抠图软件怎么操作?
  • 网站制作论文文献综述山东企业网站建设推荐
  • 代码随想录训练营打卡Day33| 动态规划part02
  • Shell简单学习
  • 2.2 常用控件
  • 潍坊网站制作软件做网站公司费用
  • 谈谈主流开源技术证书
  • 网站定位代码wordpress国内视频教程
  • CF Round 1027 Div.3 vp补题
  • Java面向对象编程:类与对象、继承、多态及final关键字详解
  • 自己制作网站app网站必须要实名认证么
  • 网站建设技术选择网站如何做ins链接分享
  • 图像生成:PyTorch从零开始实现一个简单的扩散模型
  • 网站如何做标题优化硬件工程师培训机构哪家好
  • vue canvas标注
  • 临沂手机网站信息推广技术公司电话号码wordpress插件卡
  • JavaScript ES5 函数全解析:从基础到高级应用
  • 做博物馆网站最重要上海百度提升优化
  • 做网站挣钱吗现在广东省自然资源厅吴鋆
  • 多个ElMessageBox层级问题
  • ES查询语法总结
  • 个人网站备案不能盈利东莞常平镇地图全图
  • 生物医药业销售管理软件推荐
  • 东莞网站建设seo优化华能电子商务平台
  • Python循环嵌套
  • 深入 Lua 元表与元方法