概述
Spring Boot 简化了 Spring 应用的创建和配置,提供自动配置、内嵌服务器、起步依赖等特性,实现”约定优于配置”的开发体验。
核心特性
起步依赖(Starter)
- 预定义的依赖组合,简化 Maven/Gradle 配置
- 常用 Starter:
| Starter | 用途 |
|---|---|
| spring-boot-starter-web | Web 开发(含内嵌 Tomcat) |
| spring-boot-starter-data-jpa | JPA 数据访问 |
| spring-boot-starter-data-redis | Redis |
| spring-boot-starter-security | 安全认证 |
| spring-boot-starter-actuator | 应用监控 |
| spring-boot-starter-test | 测试 |
自动配置
- 根据 classpath 中的类和已定义的 Bean 自动配置 Spring 应用
- 通过
@Conditional系列注解实现条件装配 - 可通过
@SpringBootApplication(exclude = {...})排除特定自动配置
内嵌服务器
- 默认 Tomcat,可切换为 Jetty、Undertow
- 无需部署 WAR 包,直接
java -jar运行
配置管理
application.yml / application.properties
server:
port: 8080
servlet:
context-path: /api
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
driver-class-name: com.mysql.cj.jdbc.Driver
Profile 多环境
# application-dev.yml
spring:
profiles: dev
server:
port: 8080
---
# application-prod.yml
spring:
profiles: prod
server:
port: 80
激活方式:--spring.profiles.active=dev
自定义配置属性
@ConfigurationProperties(prefix = "app")
@Component
public class AppConfig {
private String name;
private int maxSize;
// getters & setters
}
数据访问
Spring Data JPA
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByEmail(String email);
@Query("SELECT u FROM User u WHERE u.status = :status")
List<User> findByStatus(@Param("status") int status);
}
MyBatis 集成
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
多数据源
- 使用
@Primary标注默认数据源 - 通过
@Configuration+@MapperScan配置不同数据源的 SqlSessionFactory
RESTful API 开发
Controller
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping
public List<User> list() { ... }
@GetMapping("/{id}")
public User get(@PathVariable Long id) { ... }
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public User create(@RequestBody @Valid UserDTO dto) { ... }
@PutMapping("/{id}")
public User update(@PathVariable Long id, @RequestBody UserDTO dto) { ... }
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable Long id) { ... }
}
全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Map<String, Object> handleException(Exception e) {
return Map.of("code", 500, "message", e.getMessage());
}
}
应用监控(Actuator)
常用端点
| 端点 | 说明 | |——|——| | /actuator/health | 健康检查 | | /actuator/info | 应用信息 | | /actuator/metrics | 指标数据 | | /actuator/env | 环境变量 | | /actuator/beans | 所有 Bean |
自定义 Health Indicator
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder builder) {
builder.up().withDetail("version", "1.0.0");
}
}
打包与部署
Maven 打包
mvn clean package -DskipTests
java -jar target/app.jar
Docker 部署
FROM eclipse-temurin:17-jre
COPY target/app.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
常见面试题
- Spring Boot 自动配置原理?
- Spring Boot Starter 的原理?如何自定义 Starter?
- Spring Boot 配置加载顺序?
- Spring Boot Actuator 的作用?
- Spring Boot 如何实现统一异常处理?