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

目录

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


🌵项目构建

法一: 使用 Spring Initializr 创建项目

访问https://start.spring.io

"动手实践"部分用的这个方法。

法二: 通过maven

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

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

  1. 修改pom.xml(复制以下即可):
    可在官网搜索添加依赖:
    Maven Central官网:https://central.sonatype.com/
java 复制代码
<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文件中添加依赖项
java 复制代码
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <optional>true</optional>
    </dependency>
  • 修改设置:
    ①文件->搜索"编译器"->勾选"自动构建项目"
    ②文件->高级设置->找到"编译器"->勾选第一个复选框"即使开发的应用程序当前正在运行,也允许自动make启动"
  1. 至此,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 需要用到它:
java 复制代码
@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 或状态码
  • 代码示例📎
java 复制代码
@RestController
public class HelloController {

    @Autowired
    private HelloService helloService;

    @GetMapping("/hello")
    public String sayHello() {
        return helloService.getHelloMessage();
    }
}
  • 🔍 注解说明
    1.@RestController:声明这是一个控制器,所有方法返回数据而非视图
    2.@GetMapping:映射 GET 请求到 /hello
    3.@Autowired:自动注入 Service 实例

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

  • 职责
    1.封装核心业务逻辑
    2.可被多个 Controller 复用
    3.便于单元测试和事务管理
  • 代码示例📎
java 复制代码
@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 注解作用
java 复制代码
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
java 复制代码
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  // 自动注入 HelloService
    private HelloService helloService;

    @GetMapping("/hello")
    public String sayHello() {
        return helloService.getHelloMessage();
    }
}
  • 注解说明

4.启动与测试

5.拓展练习

1. 接收路径变量:/hello/{name}

目标:让接口支持个性化问候。

  • 在 HelloController.java 添加以下代码:
java 复制代码
 @GetMapping("/hello/{name}")
    public String sayHelloTo(@PathVariable String name) {
        return helloService.greet(name);
    }
  • 在 HelloService.java 添加以下代码:
java 复制代码
	public String greet(String name) {
        return "Hello, "+ name + "!";
    }

2. 接收请求参数:/hello?name=xxx

目标:支持通过查询参数传值。

  • 修改HelloController.java中 "/hello" 路径代码(删除或注释,并添加以下代码):
java 复制代码
@GetMapping("/hello")
    public String greetWithParam(@RequestParam(required = false,defaultValue = "Ahhhhh") String name) {
        return helloService.greet(name);
    }

3. 返回JSON对象

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

  • 修改 HelloService.java,添加以下代码
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 直接调用即可:
java 复制代码
@GetMapping("/hello/json")
    public Map<String,Object> helloJson(@RequestParam(required = false,defaultValue = "Ahhhhh") String name) {
        return helloService.getHelloInfo();
    }
  • ✅ 测试:访问返回的是标准 JSON 格式

    4.添加日志输出
    目标:学会记录关键操作。
  • 在HelloService 中添加日志:
java 复制代码
// 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中

java 复制代码
<!-- 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,配置如下:
java 复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
    username: 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表并插入数据:
sql 复制代码
-- 登录 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

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 层)

java 复制代码
// 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扫描

java 复制代码
// 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层,调用数据库

java 复制代码
// com.example.demo.service.HelloService
@Service
public class HelloService {
    private static final Logger log = LoggerFactory.getLogger(HelloService.class);

    @Autowired
    private 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 对象
       ↓
 ← 逐层返回消息字符串
       ↓
返回给浏览器
相关推荐
Tony Bai2 小时前
Go GUI 开发的“绝境”与“破局”:2025 年现状与展望
开发语言·后端·golang
Tony Bai2 小时前
【Go模块构建与依赖管理】08 深入 Go Module Proxy 协议
开发语言·后端·golang
Deamon Tree3 小时前
【设计题】如何实现限流器
java
短视频矩阵源码定制3 小时前
矩阵系统哪个好?2025年全方位选型指南与品牌深度解析
java·人工智能·矩阵·架构·aigc
kpli903 小时前
Java开发性能优化
java·jvm
三掌柜6663 小时前
C++ 零基础入门与冒泡排序深度实现
java·开发语言·c++
码事漫谈4 小时前
从一个问题深入解析C++字符串处理中的栈损坏
后端
卿言卿语4 小时前
CC23-最长的连续元素序列长度
java·算法·哈希算法
码事漫谈4 小时前
C++ 核心基石:深入理解 RAII 思想,告别资源泄露的噩梦
后端