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.xml
的 build
部分添加以下配置
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 还需要做几个设置

