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应用的流程
以下为我自己构建过程中的注意点:
- 修改
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>
- 可使用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启动”


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 项目中,典型的分层包括:
- Controller: 处理 HTTP 请求,参数校验,返回响应
- Service: 封装业务逻辑,是应用的核心
- 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 启动器:集成 MyBatis 到 Spring Boot --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.3</version><!--自动配置 MyBatis 核心组件(SqlSessionFactory、Mapper 扫描等)引入后无需手动配置数据源和 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 对象↓← 逐层返回消息字符串↓
返回给浏览器
