前端视角 Java Web 入门手册 5.1:真实世界 Web 开发——初识 Spring Boot

Spring Framework 是一个开源的、功能强大的 Java框架,旨在简化企业级 Java开发。它通过提供全面的基础设施支持,使开发者能够专注于业务逻辑的实现。Spring 框架由多个模块组成,如 Spring Core、Spring MVC、Spring Data、Spring Security等。开发者可以根据项目需求,选择性地引入和使用这些模块,构建灵活且可扩展的应用。

虽然 Spring 功能强大,但其配置和设置过程可能繁琐。Spring Boot 建立在 Spring Framework 之上,简化了 Spring 应用的配置和部署。它并不是另一个框架,而是一个增强Spring Framework的配置和启动工具。

Spring 和 SpringBoot 的关系有点类似于 Node.js 中 Koa 与 Egg.js 的关系,Spring 和 Koa 都是基础性的框架,提供了核心功能,但需要更多定制;Spring Boot 和 Egg.js 在各自的基础框架之上进行了增强,提供了更多的预配置和自动化工具,帮助开发者快速上手并提高效率。

使用 Spring Initializr 创建 SpringBoot 项目

Spring Initializr 是一个在线工具,用于生成Spring Boot项目的基础结构

点击 Generate 按钮,下载生成的项目压缩包并解压,即可得到如下的项目结构

plain 复制代码
hellospring
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.example.hellospring
│   │   │       ├── HellospringApplication.java
│   │   │       └── controller
│   │   │           └── HelloController.java
│   │   └── resources
│   │       ├── application.properties
│   │       └── static
│   │           └── ...
│   └── test
│       └── java
│           └── com.example.hellospring
│               └── HellospringApplicationTests.java
├── mvnw
├── mvnw.cmd
├── pom.xml
└── README.md
  • src/main/java:Java 源代码目录
  • src/main/resources:资源文件目录,如配置文件、静态资源等
  • pom.xml:Maven 项目配置文件
  • mvnw & mvnw.cmd:Maven Wrapper 脚本,确保团队使用相同版本的 Maven

Controller

既然是 Web 应用请求自然先到 Controller,Controller 负责处理 HTTP 请求,它们接收请求,调用相应的服务,并返回响应

java 复制代码
// src/main/java/com/example/hellospring/controller/HelloController.java
package com.example.hellospring.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

@RestController 用于将类标记为 Spring MVC 控制器,并自动将控制器中的方法返回的对象序列化为 JSON 或 XML 格式的响应体,它是 @Controller 和 @ResponseBody 注解的组合

  • @Controller: 标记一个类作为控制器,处理 HTTP 请求
  • @ResponseBody: 指示控制器方法的返回值应该直接写入 HTTP 响应体,而不是返回一个视图

@GetMapping@RequestMapping(method = RequestMethod.GET) 的简写,用来处理 HTTP GET 请求。sayHello 方法使用 @GetMapping("/hello") 注解,这意味着该方法会处理 /hello 的 GET 请求

通过这些注解,Spring 提供了直观和简洁的方法来定义控制器的请求映射和响应处理,大大简化了开发 RESTful 服务的工作

构建一个简单的 REST API

为了更好地理解 Spring Boot 的工作机制,通过一个简单的示例项目,构建一个 RESTful API,实现用户的 CRUD 操作

创建文件

plain 复制代码
├── pom.xml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── hellospring
    │   │               ├── HellospringApplication.java
    │   │               ├── controller
    │   │               │   └── UserController.java
    │   │               ├── model
    │   │               │   └── User.java
    │   │               └── repository
    │   │                   └── UserRepository.java
    │   └── resources
    │       ├── application.properties
    │       ├── static
    │       └── templates
    └── test

添加必要依赖

pom.xml添加依赖

xml 复制代码
<!-- Spring Boot Starter Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Data JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- H2 Database -->
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>
  • spring-boot-starter-web :用于快速启动和构建基于 Spring MVC 的 Web 应用程序。这个 Starter 包含了构建 Web 应用程序所需的常用依赖和配置,简化了开发过程
    • Spring MVC:提供构建 Web 应用的基础架构,支持 MVC 架构设计模式,帮助开发者创建 Web 控制器、服务和 View 层
    • Embedded Servers:自带嵌入式服务器(如 Tomcat、Jetty、Undertow),使应用可以独立运行,不需要额外安装外部服务器
    • RESTful Services:支持创建 RESTful 风格的 Web 服务和 API,非常适合构建轻量级服务
    • JSON 处理:默认集成 Jackson 库,用于处理 JSON 数据的序列化和反序列化
    • 数据验证:支持使用 Java Bean Validation API 进行数据验证
    • 内容协商 :提供内容协商机制,可以根据客户端请求的 Accept 头返回不同格式(如 JSON、XML)的响应
  • spring-boot-starter-data-jpa:用于简化基于 Java Persistence API (JPA) 的数据访问层开发,它集成了 Spring Data JPA 和 Hibernate ORM 等常用组件,使得与数据库的交互更加简单高效
  • com.h2database:是 Maven 依赖的一个组 ID,对应的是 H2 数据库,H2 是一种轻量级的嵌入式关系型数据库。H2 数据库因为其小巧、易于使用以及内存模式的支持,常常被用作开发、测试阶段的内存数据库

定义 Entity

在 Java 的持久化领域中,Entity 是一个非常重要的概念。实体类用来表示一个数据库表。每个实体类的实例,即一个对象,通常对应数据库表中的一行记录

  • @Entity:表明该类是一个实体,需要持久化
  • @Table:用于指定实体类对应的数据库表名,如果没有这个注解,默认表名是实体类的名字
  • @Id:指定实体的主键字段
  • @Column:用于指定实体类的某个字段对应于数据库表的特定列

实体类需要一个无参数构造函数,以便 JPA 提供的工具来构造此对象的实例

java 复制代码
// src/main/java/com/example/hellospring/model/User.java
package com.example.hellospring.model;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键的生成策略
    private Long id;

    private String name;
    private String email;

    // 构造器
    public User() {}

    public User(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getters 和 Setters

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    // toString 方法(可选)
    @Override
    public String toString() {
        return "User{id=" + id + ", name='" + name + "', email='" + email + "'}";
    }
}

创建 Repository

Repository 接口抽象化数据访问层,负责与数据库进行交互,执行 CRUD 操作,Spring Data JPA 自动生成实现类,简化数据访问逻辑

  • CrudRepository:定义了一些通用的 CRUD 操作方法。如 save()、findById()、findAll()、deleteById() 等
  • JpaRepository:继承自 CrudRepository,提供了更多 JPA 相关的功能,例如批量操作
  • PagingAndSortingRepository:扩展自 CrudRepository,添加了分页和排序功能的方法
java 复制代码
// src/main/java/com/example/hellospring/repository/UserRepository.java
package com.example.hellospring.repository;

import com.example.hellospring.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // 可以在这里定义自定义查询方法
}

编写 Controller

在传统的 Java 编程中,一个类依赖于另一个类时,通常需要明确地创建依赖对象,而在 Spring 中,框架自动决定类中依赖的对象,并创建和注入这些对象,这个过程被称为自动装配。

@Autowired 用于实现自动装配,告诉 Spring 要在上下文中找到被标注的依赖类型的 Bean,并将其注入到注解所在的位置

java 复制代码
// src/main/java/com/example/hellospring/controller/UserController.java
package com.example.hellospring.controller;

import com.example.hellospring.model.User;
import com.example.hellospring.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {
    
    private final UserRepository userRepository;
    
    @Autowired
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    // 创建用户
    @PostMapping
    public User createUser(@RequestBody User user) {
        return userRepository.save(user);
    }
    
    // 获取所有用户
    @GetMapping
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
    
    // 根据ID获取用户
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("User not found"));
    }
    
    // 更新用户
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
        return userRepository.findById(id)
                .map(user -> {
                    user.setName(updatedUser.getName());
                    user.setEmail(updatedUser.getEmail());
                    return userRepository.save(user);
                })
                .orElseThrow(() -> new RuntimeException("User not found"));
    }
    
    // 删除用户
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }
}

配置数据库访问

application.properties 或 application.yml 用于配置应用的各种参数,如数据库连接、服务器端口等

java 复制代码
# src/main/resources/application.properties

spring.application.name=hellospring

# Server Configuration
server.port=8080

# H2 Database Configuration (内存型数据库,方便测试)
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update

# H2 Console Configuration
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

项目启动后可以通过 http://localhost:8080/h2-console 可视化访问数据库

测试

创建用户

plain 复制代码
curl -X POST http://localhost:8080/users \
         -H "Content-Type: application/json" \
         -d '{"name":"Alice","email":"[email protected]"}'
         
curl -X POST http://localhost:8080/users \
     -H "Content-Type: application/json" \
     -d '{"name":"Charlie","email":"[email protected]"}'

获取所有用户

plain 复制代码
curl -X GET http://localhost:8080/users

获取单个用户

plain 复制代码
curl -X GET http://localhost:8080/users/2

更新用户

plain 复制代码
curl -X PUT http://localhost:8080/users/1 \
         -H "Content-Type: application/json" \
         -d '{"name":"Alice Smith","email":"[email protected]"}'

删除用户

plain 复制代码
curl -X DELETE http://localhost:8080/users/1

自动化构建与热部署

Spring Boot DevTools 提供了自动重启和热部署功能,类似于前端的热模块替换(HMR),可以大幅提升开发效率

xml 复制代码
<!-- pom.xml -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
  <optional>true</optional>
</dependency>

为了避免在服务环境启用,可以在 pom.xmlbuild 部分添加以下配置

xml 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>true</excludeDevtools>
            </configuration>
        </plugin>
    </plugins>
</build>

如果使用 IntelliJ IDEA 还需要做几个设置

相关推荐
碣石潇湘无限路17 分钟前
【技术】Ruby 生态概念速查表,通过对比nodejs生态(入门)
开发语言·经验分享·笔记·后端·node.js·ruby
魔道不误砍柴功33 分钟前
Java机器学习实战:基于DJL和TensorFlow的智能推荐系统
java·机器学习·tensorflow
uhakadotcom39 分钟前
CVE-2025-30208:Vite 开发服务器安全漏洞解析
后端·面试·github
二哈喇子!1 小时前
MyBatis-plus 快速入门
java
zhangpeng4555479401 小时前
用Java NIO模拟HTTPS
java·https·nio
飞奔的马里奥1 小时前
30天学Java第九天——线程
java·开发语言
工业互联网专业1 小时前
基于springboot+vue的秦皇岛旅游景点管理系统
java·vue.js·spring boot·毕业设计·源码·课程设计·旅游景点管理系统
FirstMrRight1 小时前
策略模式随笔~
后端·设计模式
Asthenia04121 小时前
面试官试图狠狠从三大垃圾回收算法拷打到七大GC器
后端
佟格湾1 小时前
聊透多线程编程-线程池-7.C# 三个Timer类
开发语言·后端·c#·多线程编程·多线程