第一部分:Spring Boot 基础
一、Spring Boot 简介
Spring Boot 是 Spring 生态系统的一部分,旨在解决传统 Spring 开发中的复杂性问题。以下是它的主要特点:
- 自动配置:根据类路径中的依赖项和配置文件,自动生成 Bean。
- 嵌入式服务器:内置 Tomcat、Jetty 或 Undertow,无需外部部署。
- 起步依赖:通过 Starter 模块简化依赖管理。
- 生产就绪特性:提供监控、健康检查等功能。
二、环境准备
在开始之前,请确保你的开发环境已经安装以下工具:
- JDK:推荐使用 JDK 17 或更高版本。
- Maven:用于管理项目依赖和构建。
- IDE:推荐使用 IntelliJ IDEA 或 Eclipse。
- Postman 或浏览器:用于测试 RESTful API。
三、创建第一个 Spring Boot 应用
1. 创建 Maven 项目
如果你使用的是 IDE(如 IntelliJ IDEA),可以直接通过向导创建。如果手动创建,则需要编写 pom.xml
文件。
以下是 pom.xml
的完整内容:
<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>com.example</groupId>
<artifactId>springboot-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Spring Boot Parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<dependencies>
<!-- Spring Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Lombok for Boilerplate Reduction -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. 创建主应用程序类
Spring Boot 应用的核心是 @SpringBootApplication
注解,它包含了三个重要功能:
@SpringBootConfiguration
:标识这是一个 Spring Boot 配置类。@EnableAutoConfiguration
:启用 Spring Boot 的自动配置功能。@ComponentScan
:扫描当前包及其子包中的组件。
以下是主应用程序类的代码:
package com.example.springbootdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
System.out.println("🚀 Spring Boot Application Started!");
}
}
3. 创建控制器类
为了演示 RESTful API 的开发,我们创建一个简单的控制器类,提供两个接口:
/hello
:返回固定的问候消息。/greeting/{name}
:根据传入的名字动态生成问候消息。
以下是控制器类的代码:
package com.example.springbootdemo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class GreetingController {
@GetMapping("/hello")
public String sayHello() {
return "🌟 Hello, World!";
}
@GetMapping("/greeting/{name}")
public String greetUser(@PathVariable String name) {
return "👋 Hello, " + name + "! Welcome to Spring Boot!";
}
}
4. 配置 application.properties
Spring Boot 提供了一个默认的配置文件 application.properties
,用于定义应用的各种参数。例如,我们可以修改默认端口号或设置应用名称。
以下是配置文件的内容:
# application.properties
server.port=8081
spring.application.name=springboot-demo-app
5. 运行应用程序
运行应用程序的方法有多种,以下是两种常见的方式:
- 通过 IDE 启动:直接运行
SpringBootDemoApplication
类中的main
方法。 - 通过 Maven 命令启动:在终端中运行以下命令:
mvn spring-boot:run
启动成功后,你会在控制台看到类似以下的日志输出:
...
2023-xx-xx xx:xx:xx [main] INFO com.example.springbootdemo.SpringBootDemoApplication - 🚀 Spring Boot Application Started!
6. 测试接口
启动完成后,可以通过浏览器或 Postman 测试接口:
-
访问
/hello
接口:http://localhost:8081/api/hello
返回结果:
🌟 Hello, World!
-
访问
/greeting/{name}
接口:http://localhost:8081/api/greeting/Alice
返回结果:
👋 Hello, Alice! Welcome to Spring Boot!
第二部分:扩展功能与高级特性
一、数据库集成
为应用添加数据库支持,可以使用 MySQL、PostgreSQL 或 H2 数据库。以下是一个简单的 MySQL 集成示例:
1. 添加依赖
在 pom.xml
中添加 MySQL 和 JPA 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2. 配置数据库连接
在 application.properties
中配置数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=your_password
spring.jpa.hibernate.ddl-auto=update
3. 创建实体类和 Repository 接口
// Entity Class
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getters and Setters
}
// Repository Interface
public interface UserRepository extends JpaRepository<User, Long> {}
二、异常处理
为接口添加全局异常处理器,提高系统的健壮性。创建一个 GlobalExceptionHandler
类:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<?> handleResourceNotFoundException(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
}
@ExceptionHandler(Exception.class)
public ResponseEntity<?> handleException(Exception ex) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Error: " + ex.getMessage());
}
}
三、单元测试
使用 JUnit 和 Mockito 编写单元测试,确保代码质量。以下是一个简单的测试示例:
@SpringBootTest
class GreetingControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
void testSayHello() throws Exception {
mockMvc.perform(get("/api/hello"))
.andExpect(status().isOk())
.andExpect(content().string("🌟 Hello, World!"));
}
}
四、Swagger 文档
集成 Swagger,自动生成 API 文档。在 pom.xml
中添加依赖:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
然后在主类上添加注解:
@SpringBootApplication
@EnableSwagger2
public class SpringBootDemoApplication { ... }
访问 http://localhost:8081/swagger-ui.html
查看文档。
第三部分:深入学习
一、自动配置(Auto-Configuration)
Spring Boot 的自动配置通过扫描类路径中的依赖项,结合默认配置规则,自动生成 Bean 并注入到 Spring 容器中。
- 如何工作:
- Spring Boot 在启动时会加载
META-INF/spring.factories
文件中的配置。 - 根据类路径中的依赖项,匹配相应的
@Conditional
注解条件。 - 如果条件满足,则创建并注册相应的 Bean。
- Spring Boot 在启动时会加载
二、Starter 模块
Spring Boot 提供了一系列的 Starter 模块,用于简化依赖管理。每个 Starter 模块都包含一组相关的依赖项和自动配置规则。
- 常用 Starter 模块:
spring-boot-starter-web
:用于构建 Web 应用。spring-boot-starter-data-jpa
:用于数据库集成。spring-boot-starter-security
:用于安全认证。spring-boot-starter-test
:用于单元测试。
三、外部化配置
Spring Boot 支持通过外部化配置文件(如 application.properties
或 application.yml
)来管理应用的配置参数。
-
支持的配置文件格式:
.properties
文件:server.port=8081 spring.application.name=springboot-demo-app
.yml
文件:server: port: 8081 spring: application: name: springboot-demo-app
-
优先级规则:
Spring Boot 支持多种配置来源,优先级从高到低如下:- 命令行参数(如
--server.port=8081
)。 - 系统环境变量。
- 配置文件(
application.properties
或application.yml
)。 - 默认值。
- 命令行参数(如
四、Actuator 监控
Spring Boot Actuator 是一个用于监控和管理应用的模块。它可以提供健康检查、指标监控、线程分析等功能。
-
启用 Actuator:
在pom.xml
中添加依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
常用端点:
/actuator/health
:检查应用的健康状态。/actuator/metrics
:查看应用的性能指标。/actuator/env
:查看应用的环境变量。
第四部分:高级功能与优化
一、异步任务处理
Spring Boot 提供了强大的异步任务支持,可以显著提升应用的并发处理能力。通过 @Async
注解,你可以轻松实现异步方法调用。
-
启用异步支持:
在主类或配置类中添加@EnableAsync
注解:@SpringBootApplication @EnableAsync public class SpringBootDemoApplication { ... }
-
示例代码:
创建一个服务类,使用@Async
注解定义异步方法:@Service public class AsyncService { @Async public void executeAsyncTask() { System.out.println("Running async task..."); try { Thread.sleep(2000); // Simulate a long-running task } catch (InterruptedException e) { e.printStackTrace(); } } }
调用异步方法时无需等待其完成:
@RestController @RequestMapping("/api") public class AsyncController { @Autowired private AsyncService asyncService; @GetMapping("/async") public String triggerAsyncTask() { asyncService.executeAsyncTask(); return "Async task triggered!"; } }
二、缓存机制
缓存是提高应用性能的重要手段之一。Spring Boot 提供了对多种缓存解决方案的支持,例如 EhCache、Redis 和 Caffeine。
-
启用缓存支持:
在主类或配置类中添加@EnableCaching
注解:@SpringBootApplication @EnableCaching public class SpringBootDemoApplication { ... }
-
示例代码:
使用@Cacheable
注解标记需要缓存的方法:@Service public class CacheService { @Cacheable(value = "greetings", key = "#name") public String getGreeting(String name) { System.out.println("Generating greeting for " + name); return "Hello, " + name + "!"; } }
第一次调用时会生成结果并缓存,后续调用直接从缓存中获取:
@RestController @RequestMapping("/api") public class CacheController { @Autowired private CacheService cacheService; @GetMapping("/cache/{name}") public String testCache(@PathVariable String name) { return cacheService.getGreeting(name); } }
三、多环境配置
在实际开发中,通常需要为不同的环境(如开发、测试、生产)提供不同的配置。Spring Boot 支持通过 application-{profile}.properties
文件实现多环境配置。
-
创建多环境配置文件:
application-dev.properties
:开发环境配置。application-prod.properties
:生产环境配置。
-
激活指定环境:
在application.properties
中设置活动环境:spring.profiles.active=dev
或通过命令行参数激活:
java -jar your-app.jar --spring.profiles.active=prod
四、安全性增强
Spring Boot 提供了对 Spring Security 的强大支持,可以帮助你快速实现用户认证和授权。
-
启用 Spring Security:
在pom.xml
中添加依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
-
自定义安全配置:
创建一个配置类,定义访问规则:@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/api/public").permitAll() // 允许访问公共接口 .anyRequest().authenticated() // 其他接口需要认证 .and() .formLogin().disable() // 禁用表单登录 .httpBasic(); // 启用 HTTP Basic 认证 } }
第五部分:性能优化与监控
一、线程池优化
Spring Boot 默认使用 Tomcat 嵌入式容器,可以通过调整线程池参数来优化性能。
- 配置线程池参数:
server.tomcat.max-threads=500 server.tomcat.min-spare-threads=50 server.tomcat.accept-count=200
二、数据库连接池优化
使用 HikariCP(Spring Boot 默认的数据库连接池)进行优化。
- 配置连接池参数:
spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.idle-timeout=30000
三、监控与报警
结合 Spring Boot Actuator 和第三方工具(如 Prometheus 和 Grafana),可以实现全方位的监控和报警。
-
集成 Prometheus:
在pom.xml
中添加依赖:<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>
暴露 Prometheus 端点:
management.endpoints.web.exposure.include=* management.endpoint.metrics.enabled=true
使用 Grafana 可视化指标数据。