Spring Boot
现代 Java 应用开发的核心框架。遵循“约定优于配置”的设计理念,通过自动配置、起步依赖和内嵌服务器,显著降低 Spring 应用的初始化和开发复杂度。
核心概念概述
🎯 什么是 Spring Boot?
Spring Boot 是基于 Spring 生态构建的快速应用开发框架。它不是为了替代 Spring,而是为了让 Spring 变得更简单。它通过"约定优于配置"的原则,消除了大量的样板式配置,让开发者能够真正专注于业务逻辑的实现。
💡 核心设计理念
约定优于配置
提供智能默认值,减少配置文件编写
开箱即用
预配置的 Starter 依赖,快速启动项目
生产就绪
内置监控、健康检查等企业级特性
💡 小提示
Spring Boot 并不是替代 Spring,而是建立在 Spring 之上,使 Spring 应用开发变得更加简单高效。
架构全景图
核心特性解析
自动配置
基于条件注解(如 @ConditionalOnClass),在运行时按需加载组件,避免冗余配置。
起步依赖
Starter 将常用依赖进行聚合,降低依赖冲突风险。如 web, data-jpa, security 等。
内嵌容器
内置 Tomcat, Jetty 或 Undertow,无需外部部署 WAR 包,直接运行 JAR。
Maven 基础配置示例
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
注解详解
🎯 核心注解
@SpringBootApplication
组合注解,等价于:
@SpringBootConfiguration- 标识配置类@EnableAutoConfiguration- 启用自动配置@ComponentScan- 组件扫描
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
🔧 配置相关注解
@ConfigurationProperties
类型安全的配置属性绑定,支持输入验证。
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private int timeout;
}
@Value
注入单个配置值,支持 SpEL 表达式。
@Value("${app.name}")
private String appName;
@Value("${app.timeout:30}")
private int timeout;
🏛️ 条件注解
控制 Bean 的创建条件,是自动配置的基础。
-
@ConditionalOnClass- 类路径中存在指定类时生效 -
@ConditionalOnMissingBean- 容器中不存在指定 Bean 时生效 -
@ConditionalOnProperty- 配置属性匹配时生效 -
@ConditionalOnExpression- SpEL 表达式为 true 时生效
配置体系
📄 配置文件格式
application.properties
server.port=8080
spring.application.name=myapp
spring.datasource.url=jdbc:mysql://localhost:3306/db
application.yml (推荐)
server:
port: 8080
spring:
application:
name: myapp
datasource:
url: jdbc:mysql://localhost:3306/db
🎯 多环境配置 (Profiles)
通过 Profiles 实现开发、测试、生产环境的配置隔离。
文件命名规则
application.yml- 基础配置application-dev.yml- 开发环境application-test.yml- 测试环境application-prod.yml- 生产环境
spring:
profiles:
active: dev # 激活开发环境
java -jar app.jar --spring.profiles.active=prod
🔑 外部化配置
Spring Boot 支持多种配置源,优先级从高到低:
- 命令行参数
- 系统环境变量
- 外部配置文件(当前目录)
- 内部配置文件(classpath)
export SPRING_DATASOURCE_PASSWORD=secret
export SERVER_PORT=9090
学习路径详解
1. 基础入门
掌握 Spring Initializr 的使用,理解 @SpringBootApplication 注解的含义,编写第一个 Hello World 接口。
2. 配置管理
学习 application.yml 与 properties 的区别,掌握多环境配置(Profiles)及外部化配置。掌握 @Value 与 @ConfigurationProperties。
4. Web 开发
掌握 RESTful API 开发,理解 @RestController、@RequestMapping 等注解。学习全局异常处理和参数验证。
5. 数据访问
整合 Spring Data JPA 或 MyBatis,理解自动配置的数据源与事务管理。
6. 监控与运维
集成 Actuator,通过端点查看应用健康状态、度量指标等生产级信息。
实践与进阶
项目结构规范
src/main/java
├── Application.java # 启动类
├── controller/ # 表现层
├── service/ # 业务层
├── repository/ # 数据访问层
├── model/ # 实体模型
└── config/ # 配置类
监控端点 (Actuator)
最佳实践指南
- ✅ 采用清晰的分层架构,保持代码整洁。
- ✅ 配置与代码解耦,敏感信息使用环境变量。
- ✅ 统一日志规范,使用 SLF4J + Logback。
- ✅ 实现全局异常处理,返回统一响应格式。
- ✅ 保证单元测试与集成测试的覆盖率。
测试策略
🧪 单元测试
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void testCreateUser() {
User user = new User("test", "test@example.com");
User saved = userService.createUser(user);
assertNotNull(saved.getId());
assertEquals("test", saved.getName());
}
}
🏛️ 集成测试
Controller 测试
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
void testGetUser() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("test"));
}
}
Repository 测试
@DataJpaTest
class UserRepositoryTest {
@Autowired
private UserRepository repository;
@Test
void testSaveUser() {
User user = new User("test", "test@example.com");
User saved = repository.save(user);
assertNotNull(saved.getId());
}
}
📦 测试配置
使用独立的测试配置文件,避免影响生产环境。
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create-drop
进阶生态整合
💾 数据库
MySQL, PostgreSQL, MongoDB, Redis
spring:
datasource:
url: jdbc:mysql://localhost:3306/db
username: root
password: password
jpa:
hibernate:
ddl-auto: update
📨 消息系统
Kafka, RabbitMQ, RocketMQ
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: my-group
☁️ 云原生
Docker, Kubernetes, Spring Cloud
FROM openjdk:17-slim
COPY target/app.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
性能优化
🚀 启动速度优化
- 使用
spring-boot-devtools开启热部署 - 排除不需要的自动配置类
- 延迟初始化非关键 Bean
- 使用
@Lazy注解
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class,
RedisAutoConfiguration.class
})
📊 运行时性能调优
连接池优化
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
connection-timeout: 30000
缓存配置
@EnableCaching
@Configuration
public class CacheConfig {
@Bean
public CacheManager cacheManager() {
return new CaffeineCacheManager();
}
}
异步处理
@EnableAsync
@Configuration
public class AsyncConfig {
@Bean
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
return executor;
}
}
监控与运维
📊 Spring Boot Actuator
Actuator 提供了生产级特性,帮助监控和管理应用。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: health,info,metrics,env
endpoint:
health:
show-details: always
🛠️ 常用监控端点
应用健康状态
JVM、系统指标
配置属性信息
容器 Bean 列表
动态调整日志
线程堆栈信息
🔔 自定义健康检查
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
// 检查外部依赖,如数据库、缓存等
boolean isHealthy = checkExternalService();
if (isHealthy) {
return Health.up()
.withDetail("service", "available")
.build();
} else {
return Health.down()
.withDetail("service", "unavailable")
.build();
}
}
private boolean checkExternalService() {
// 实际检查逻辑
return true;
}
}
📊 集成 Prometheus + Grafana
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: prometheus
metrics:
export:
prometheus:
enabled: true
安全最佳实践
🔒 Spring Security 集成
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(Customizer.withDefaults())
.csrf(csrf -> csrf.disable());
return http.build();
}
}
🛡️ 安全清单
- ✅ 敏感信息使用环境变量或配置中心
- ✅ 启用 HTTPS,使用 SSL/TLS 证书
- ✅ 关闭生产环境的 Actuator 敏感端点
- ✅ 使用 JWT 或 OAuth2 进行身份验证
- ✅ 实现请求限流防止 DDoS 攻击
- ✅ 输入验证,防止 SQL 注入和 XSS 攻击
部署策略
📦 打包方式
JAR 包 (推荐)
mvn clean package
java -jar target/app.jar
WAR 包
<packaging>war</packaging>
@SpringBootApplication
public class App extends SpringBootServletInitializer {}
Docker 镜像
docker build -t myapp:1.0 .
docker run -p 8080:8080 myapp:1.0
☁️ 云部署方案
Kubernetes 部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-app
spec:
replicas: 3
selector:
matchLabels:
app: spring-boot-app
template:
metadata:
labels:
app: spring-boot-app
spec:
containers:
- name: app
image: myapp:1.0
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "production"
常见问题
❓ 为什么自动配置没有生效?
- 检查相关依赖是否已引入
- 查看 @ConditionalOnXxx 注解的条件是否满足
- 使用
--debug启动查看自动配置报告 - 检查是否被 exclude 排除
🔍 Debug 模式
启动时添加 --debug 参数,可以查看详细的自动配置报告,包括哪些配置生效了,哪些没有生效。
❓ 如何解决端口冲突?
server:
port: 8081 # 修改默认端口
# 或者使用随机端口
server:
port: 0
❓ 如何禁用某个自动配置?
@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
spring:
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
❓ 如何查看加载了哪些 Bean?
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ConfigurableApplicationContext context =
SpringApplication.run(Application.class, args);
String[] beanNames = context.getBeanDefinitionNames();
Arrays.stream(beanNames).forEach(System.out::println);
}
}
❓ 如何优化启动速度?
- 使用
spring.main.lazy-initialization=true延迟初始化 - 排除不需要的自动配置类
- 减少 @ComponentScan 扫描范围
- 使用 Spring Native 构建原生镜像
- 优化依赖,移除未使用的 Starter
⚠️ 注意
延迟初始化可能会将启动时的错误推迟到运行时,请谨慎使用。
❓ 如何处理跨域问题?
@Configuration
public class CorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.allowCredentials(true);
}
};
}
}