Spring Boot 是由 Pivotal 团队开发的一个开源框架,旨在简化基于 Spring 的应用程序开发。它通过约定优于配置(Convention over Configuration)的理念,减少了开发者在项目配置上的繁琐步骤,使得构建独立、生产级别的 Spring 应用更加高效和便捷。
传统的 Spring 应用需要大量的 XML 配置或 Java 配置类,Spring Boot 通过自动配置和约定大于配置的理念,大幅减少了配置的复杂性。
内嵌服务器和自动配置让开发者能够更专注于业务逻辑,快速构建和测试应用。
Spring Boot 应用可以打包成一个独立的 JAR 文件,包含所有必要的依赖和内嵌服务器,简化了部署过程。
Spring Boot 与 Spring 生态系统中的众多项目(如 Spring Data、Spring Security、Spring Cloud)无缝集成,提供丰富的功能扩展。
拥有庞大的社区支持和丰富的文档资源,开发者可以轻松获取帮助和最佳实践。
在开始使用 Spring Boot 之前,需要准备开发环境,包括安装 JDK、构建工具和集成开发环境(IDE)。
Spring Boot 需要 Java 8 及以上版本。建议安装最新的稳定版本。
下载地址:Oracle JDK 或 OpenJDK
验证安装:
java -version
输出示例:
java version "11.0.10" 2021-01-19 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.10+9-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.10+9-LTS, mixed mode)
Spring Boot 支持 Maven 和 Gradle 作为构建工具。选择其一进行安装和配置。
安装 Maven:
mvn -v
输出示例:
Apache Maven 3.6.3
Maven home: /opt/apache-maven
Java version: 11.0.10, vendor: Oracle Corporation
安装 Gradle:
gradle -v
输出示例:
------------------------------------------------------------
Gradle 6.8.3
------------------------------------------------------------
Build time: 2021-02-22 16:45:07 UTC
Revision: 58d6ac067c72069f6ac2273a8c778cd5ef7c2b93
Kotlin: 1.4.30
Groovy: 2.5.12
Ant: Apache Ant(TM) version 1.10.9 compiled on September 27 2020
JVM: 11.0.10 (Oracle Corporation 11.0.10+9-LTS)
OS: Mac OS X 10.15.7 x86_64
推荐使用 IntelliJ IDEA、Eclipse 或 VS Code 等支持 Spring Boot 开发的 IDE。
Spring Boot 提供了命令行工具(CLI)用于快速创建和运行应用。
安装指南:Spring Boot CLI
验证安装:
spring --version
输出示例:
Spring CLI v2.5.4
有多种方式创建 Spring Boot 项目,以下介绍使用 Spring Initializr 和 IDE 内置工具创建项目的方法。
访问 Spring Initializr:https://start.spring.io/
配置项目参数:
添加依赖:
点击 "Add Dependencies",选择 "Spring Web"。
生成项目:
点击 "Generate",下载生成的 ZIP 文件。
导入项目到 IDE:
启动 IntelliJ IDEA。
创建新项目:
配置项目参数:
选择依赖:
完成创建:
定位主类:
在项目结构中找到 DemoApplication.java,通常位于 src/main/java/com/example/demo 目录下。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
运行应用:
DemoApplication.java,选择 "Run 'DemoApplication'"。或者在终端中导航到项目根目录,执行以下命令:
mvn spring-boot:run
或使用 Gradle:
gradle bootRun
访问应用:
应用默认运行在 http://localhost:8080。可以在浏览器中访问该地址,若无特殊配置,会看到默认的错误页面,因为还未配置任何控制器。
Spring Boot 通过简化配置和集成 Spring 生态系统的各种组件,提供了一套完整的开发框架。以下是 Spring Boot 的几个核心概念和组件。
控制器负责处理 HTTP 请求,定义应用的路由和业务逻辑。
示例:创建一个简单的控制器
package com.example.demo.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:标识这是一个 REST 控制器,返回的数据会自动序列化为 JSON 或其他格式。@GetMapping("/hello"):定义一个 GET 请求的路由为 /hello,当访问该路由时,会执行 hello() 方法。访问效果:
访问 http://localhost:8080/hello,浏览器将显示:
Hello, Spring Boot!
服务层负责处理业务逻辑,通常用于封装复杂的业务操作,控制器通过调用服务来完成任务。
示例:创建一个服务类
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class GreetingService {
public String getGreeting() {
return "Hello from GreetingService!";
}
}
说明:
@Service:标识这是一个服务组件,Spring 会自动扫描并管理该类的实例。在控制器中使用服务
package com.example.demo.controller;
import com.example.demo.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GreetingController {
@Autowired
private GreetingService greetingService;
@GetMapping("/greet")
public String greet() {
return greetingService.getGreeting();
}
}
说明:
@Autowired:自动注入 GreetingService 的实例,供控制器使用。访问效果:
访问 http://localhost:8080/greet,浏览器将显示:
Hello from GreetingService!
仓库层负责与数据源(如数据库)进行交互,执行 CRUD(创建、读取、更新、删除)操作。Spring Data JPA 提供了便捷的仓库接口,简化数据访问层的开发。
示例:创建实体类和仓库接口
实体类:
package com.example.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// 构造方法、Getter 和 Setter 略
}
仓库接口:
package com.example.demo.repository;
import com.example.demo.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
User findByEmail(String email);
}
说明:
@Entity:标识这是一个 JPA 实体,对应数据库表。UserRepository 继承自 JpaRepository,提供了基本的 CRUD 操作。findByEmail。在服务中使用仓库
package com.example.demo.service;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public User createUser(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
return userRepository.save(user);
}
public User getUserByEmail(String email) {
return userRepository.findByEmail(email);
}
}
在控制器中使用服务
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public User createUser(@RequestParam String name, @RequestParam String email) {
return userService.createUser(name, email);
}
@GetMapping
public User getUser(@RequestParam String email) {
return userService.getUserByEmail(email);
}
}
说明:
@RequestMapping("/users"):定义基础路由为 /users。@PostMapping:处理 POST 请求,用于创建用户。@GetMapping:处理 GET 请求,用于获取用户信息。访问效果:
创建用户:
使用工具(如 Postman)发送 POST 请求到 http://localhost:8080/users,带上参数 name 和 email。
获取用户:
发送 GET 请求到 http://localhost:8080/users?email=example@example.com,获取对应用户的信息。
Spring Boot 提供了一套 Starter POMs,简化了依赖管理。通过引入 Starter,可以自动添加一组相关的依赖,避免手动添加和版本冲突。
常用的 Starter 依赖:
spring-boot-starter-web:用于构建 Web 应用,包含 Spring MVC、Tomcat 等。spring-boot-starter-data-jpa:用于数据访问,包含 Spring Data JPA、Hibernate 等。spring-boot-starter-security:用于安全性,包含 Spring Security 等。spring-boot-starter-test:用于测试,包含 JUnit、Mockito 等。示例:pom.xml 中添加 Starter 依赖
<dependencies>
<!-- Spring Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Data JPA Starter -->
<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 Test Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Spring Boot 的自动配置机制会根据项目的依赖和配置,自动配置 Spring 应用的各个部分。例如,添加 spring-boot-starter-web 依赖后,自动配置了 Spring MVC 和内嵌的 Tomcat 服务器。
启用自动配置
通过在主类上添加 @SpringBootApplication 注解,启用自动配置、组件扫描和 Spring 配置支持。
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
解释:
@SpringBootApplication 包含了以下注解:
@SpringBootConfiguration:标识这是一个 Spring Boot 配置类。@EnableAutoConfiguration:启用自动配置。@ComponentScan:启用组件扫描,自动发现和注册 Spring 组件。Spring Boot 支持多种数据访问技术,其中最常用的是 Spring Data JPA。本文将介绍如何使用 Spring Data JPA 进行数据库操作。
添加依赖
在 pom.xml 中添加 spring-boot-starter-data-jpa 和数据库驱动(如 H2、MySQL、PostgreSQL 等)的依赖。
<dependencies>
<!-- Spring Data JPA Starter -->
<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>
</dependencies>
在 src/main/resources/application.properties 文件中配置数据库连接信息。
示例:使用 H2 内存数据库
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true
说明:
spring.datasource.url:数据库连接 URL。spring.datasource.driverClassName:数据库驱动类名。spring.datasource.username 和 spring.datasource.password:数据库用户名和密码。spring.jpa.database-platform:JPA 方言,用于生成 SQL。spring.h2.console.enabled:启用 H2 数据库控制台,方便调试。前面已经介绍了 User 实体类,这里再提供一个示例。
package com.example.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity // 标识为 JPA 实体
public class Product {
@Id // 主键
@GeneratedValue(strategy = GenerationType.IDENTITY) // 自增策略
private Long id;
private String name;
private Double price;
// 构造方法、Getter 和 Setter 略
}
package com.example.demo.repository;
import com.example.demo.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
// 自定义查询方法
Product findByName(String name);
}
package com.example.demo.service;
import com.example.demo.model.Product;
import com.example.demo.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
// 创建产品
public Product createProduct(String name, Double price) {
Product product = new Product();
product.setName(name);
product.setPrice(price);
return productRepository.save(product);
}
// 获取所有产品
public List<Product> getAllProducts() {
return productRepository.findAll();
}
// 根据名称获取产品
public Product getProductByName(String name) {
return productRepository.findByName(name);
}
}
package com.example.demo.controller;
import com.example.demo.model.Product;
import com.example.demo.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/products")
public class ProductController {
@Autowired
private ProductService productService;
// 创建产品
@PostMapping
public Product createProduct(@RequestParam String name, @RequestParam Double price) {
return productService.createProduct(name, price);
}
// 获取所有产品
@GetMapping
public List<Product> getAllProducts() {
return productService.getAllProducts();
}
// 根据名称获取产品
@GetMapping("/search")
public Product getProductByName(@RequestParam String name) {
return productService.getProductByName(name);
}
}
启用 H2 控制台
在 application.properties 中已启用 H2 控制台:
spring.h2.console.enabled=true
访问控制台
启动应用后,访问 http://localhost:8080/h2-console。
配置连接
jdbc:h2:mem:testdbsa使用控制台
可以通过 H2 控制台查看和操作数据库中的数据,如查询 Product 表。
Spring Boot 提供了丰富的测试支持,包括单元测试、集成测试等。以下介绍如何编写和运行测试。
Spring Boot 项目通常包含 spring-boot-starter-test 依赖,用于测试支持。
<dependencies>
<!-- Spring Boot Test Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
使用 JUnit 5 编写单元测试。
示例:测试 GreetingService
package com.example.demo.service;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class GreetingServiceTest {
private GreetingService greetingService = new GreetingService();
@Test
public void testGetGreeting() {
String greeting = greetingService.getGreeting();
assertEquals("Hello from GreetingService!", greeting);
}
}
使用 Spring Boot 提供的测试支持,编写集成测试,测试应用的整体功能。
示例:测试 UserController
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
// 加载完整的 Spring 应用上下文
@SpringBootTest
// 自动配置 MockMvc
@AutoConfigureMockMvc
public class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private UserRepository userRepository;
@BeforeEach
public void setup() {
userRepository.deleteAll();
User user = new User();
user.setName("John Doe");
user.setEmail("john@example.com");
userRepository.save(user);
}
@Test
public void testGetUser() throws Exception {
mockMvc.perform(get("/users")
.param("email", "john@example.com")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(content().json("{\"id\":1,\"name\":\"John Doe\",\"email\":\"john@example.com\"}"));
}
}
说明:
@SpringBootTest:加载完整的应用上下文,进行集成测试。@AutoConfigureMockMvc:自动配置 MockMvc,用于模拟 HTTP 请求。MockMvc:模拟 HTTP 请求和响应,用于测试控制器。@BeforeEach:在每个测试方法之前执行,初始化测试数据。在 IDE 中,右键点击测试类或测试方法,选择 "Run" 运行测试。也可以在终端中使用 Maven 或 Gradle 运行测试。
使用 Maven:
mvn test
使用 Gradle:
gradle test
Spring Boot 应用可以轻松地部署到各种环境,包括本地服务器、云平台(如 AWS、Azure、GCP)、容器(如 Docker)等。以下介绍几种常见的部署方式。
Spring Boot 应用可以打包成一个独立的可执行 JAR 文件,包含所有依赖和内嵌服务器。
使用 Maven 打包
mvn clean package
生成的 JAR 文件位于 target 目录下,如 demo-0.0.1-SNAPSHOT.jar。
运行 JAR 文件
java -jar target/demo-0.0.1-SNAPSHOT.jar
安装 Heroku CLI:下载地址
登录 Heroku:
heroku login
创建 Heroku 应用:
heroku create your-app-name
推送代码到 Heroku:
git add .
git commit -m "Deploy to Heroku"
git push heroku main
访问应用:
heroku open
在项目根目录下创建 Dockerfile:
# 使用官方 OpenJDK 镜像作为基础镜像
FROM openjdk:11-jdk-slim
# 设置应用的 JAR 文件名称
ARG JAR_FILE=target/demo-0.0.1-SNAPSHOT.jar
# 将 JAR 文件复制到容器中
COPY ${JAR_FILE} app.jar
# 运行应用
ENTRYPOINT ["java","-jar","/app.jar"]
docker build -t demo-app .
docker run -d -p 8080:8080 demo-app
说明:
-d:后台运行容器。-p 8080:8080:将容器的 8080 端口映射到主机的 8080 端口。访问 http://localhost:8080,即可访问运行在 Docker 容器中的 Spring Boot 应用。
可能原因:
解决方法:
检查端口占用,修改 application.properties 中的端口配置:
server.port=9090
pom.xml 或 build.gradle 中的依赖是否完整,执行 mvn clean install 或 gradle build 重新构建。可能原因:
解决方法:
可能原因:
解决方法:
mvn dependency:tree 或 gradle dependencies 查看依赖树,识别冲突。在 pom.xml 中使用 dependencyManagement 管理依赖版本,确保统一。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>3.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
可能原因:
解决方法:
src/main/resources/static 目录下。可能原因:
解决方法:
在控制器或全局配置中启用 CORS(跨域资源共享)。
示例:在控制器中启用 CORS
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://localhost:3000")
public class ApiController {
// 控制器方法
}
示例:全局配置 CORS
package com.example.demo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true);
}
};
}
}
Spring Boot DevTools:用于开发过程中的热重载和快速调试。
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
Lombok:简化 Java 代码,通过注解自动生成 Getter、Setter、构造方法等。
添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
注意:需要在 IDE 中安装 Lombok 插件,并启用注解处理器。
通过本文的介绍,你已经了解了 Spring Boot 的基本概念、安装配置、创建项目、核心组件的使用以及常见问题的解决方法。Spring Boot 以其简化配置、快速开发和强大的生态系统,成为现代 Java 开发的首选框架。持续的学习和实践,将帮助你更好地掌握 Spring Boot,并构建高效、可维护的应用程序。
学习建议:
祝你在 Spring Boot 的学习和开发之旅中取得成功!
非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
在 IntelliJ IDEA 中,提示 “the file size exceeds the configured limit. Code insight features are not available” 表示当前文件的大小超出了 IDEA 的默认限制,因此无法启用代码自动提示、语法高亮等功能。默认文件大小限制为 2.5 MB。 解决方法 方
ProxySQL 是一个高性能、高可用性的 MySQL 代理,旨在为 MySQL 数据库提供负载均衡、读写分离、故障转移、查询缓存等高级功能。它通过在客户端和 MySQL 服务器之间充当中间层,实现对数据库连接和查询的智能管理,从而提升整体系统的性能和可靠性。
迁移 Git 仓库是一个常见需求,尤其是在更换代码托管平台(如从 GitHub 迁移到 GitLab,或从本地仓库迁移到远程仓库)时。以下是几种常见的 Git 仓库迁移方法,具体使用哪种方法取决于你需要保留的内容(如历史记录、分支、
Base64 是一种常用的编码方式,用于将二进制数据转换为ASCII字符,以便在文本环境中安全地传输和存储。由于许多传输媒介(如电子邮件、HTTP协议)对二进制数据有特定的限制或处理方式,Base64提供了一种可靠的方法来确保数据在这些环境中的完整性和可读性。
一、什么是 settings.xml settings.xml 是 Maven 的配置文件,用于定义用户级别或全局的构建配置。它包含了对 Maven 构建过程影响较大的设置,如: 本地仓库的位置 远程仓库的镜像 代理服务器配置 认证信息(如私有仓库的用户名和