Spring Boot

现代 Java 应用开发的核心框架。遵循“约定优于配置”的设计理念,通过自动配置、起步依赖和内嵌服务器,显著降低 Spring 应用的初始化和开发复杂度。

快速开发
🚀 开箱即用
🔧 生产就绪
🌐 生态丰富

核心概念概述

🎯 什么是 Spring Boot?

Spring Boot 是基于 Spring 生态构建的快速应用开发框架。它不是为了替代 Spring,而是为了让 Spring 变得更简单。它通过"约定优于配置"的原则,消除了大量的样板式配置,让开发者能够真正专注于业务逻辑的实现。

💡 核心设计理念

约定优于配置

提供智能默认值,减少配置文件编写

开箱即用

预配置的 Starter 依赖,快速启动项目

生产就绪

内置监控、健康检查等企业级特性

💡 小提示

Spring Boot 并不是替代 Spring,而是建立在 Spring 之上,使 Spring 应用开发变得更加简单高效。

架构全景图

SPRING BOOT 架构全景图 Spring Boot CORE ENGINE 自动配置 起步依赖 内嵌容器 监控管理 APPLICATION

核心特性解析

⚙️

自动配置

基于条件注解(如 @ConditionalOnClass),在运行时按需加载组件,避免冗余配置。

📦

起步依赖

Starter 将常用依赖进行聚合,降低依赖冲突风险。如 web, data-jpa, security 等。

🚀

内嵌容器

内置 Tomcat, Jetty 或 Undertow,无需外部部署 WAR 包,直接运行 JAR。

Maven 基础配置示例

pom.xml
<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 - 组件扫描
Application.java
@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 - 生产环境
application.yml
spring:
  profiles:
    active: dev  # 激活开发环境
命令行指定
java -jar app.jar --spring.profiles.active=prod

🔑 外部化配置

Spring Boot 支持多种配置源,优先级从高到低:

  1. 命令行参数
  2. 系统环境变量
  3. 外部配置文件(当前目录)
  4. 内部配置文件(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)

Health Check
/actuator/health
Metrics
/actuator/metrics
App Info
/actuator/info

最佳实践指南

  • ✅ 采用清晰的分层架构,保持代码整洁。
  • ✅ 配置与代码解耦,敏感信息使用环境变量。
  • ✅ 统一日志规范,使用 SLF4J + Logback。
  • ✅ 实现全局异常处理,返回统一响应格式。
  • ✅ 保证单元测试与集成测试的覆盖率。

测试策略

🧪 单元测试

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
UserServiceTest.java
@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());
    }
}

📦 测试配置

使用独立的测试配置文件,避免影响生产环境。

src/test/resources/application-test.yml
spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
  jpa:
    hibernate:
      ddl-auto: create-drop

进阶生态整合

💾 数据库

MySQL, PostgreSQL, MongoDB, Redis

application.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/db
    username: root
    password: password
  jpa:
    hibernate:
      ddl-auto: update

📨 消息系统

Kafka, RabbitMQ, RocketMQ

Kafka 配置
spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group

☁️ 云原生

Docker, Kubernetes, Spring Cloud

Dockerfile
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 提供了生产级特性,帮助监控和管理应用。

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,env
  endpoint:
    health:
      show-details: always

🛠️ 常用监控端点

健康检查
/actuator/health

应用健康状态

指标信息
/actuator/metrics

JVM、系统指标

环境变量
/actuator/env

配置属性信息

Bean 信息
/actuator/beans

容器 Bean 列表

日志级别
/actuator/loggers

动态调整日志

线程信息
/actuator/threaddump

线程堆栈信息

🔔 自定义健康检查

CustomHealthIndicator.java
@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

pom.xml
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
application.yml
management:
  endpoints:
    web:
      exposure:
        include: prometheus
  metrics:
    export:
      prometheus:
        enabled: true

安全最佳实践

🔒 Spring Security 集成

pom.xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
SecurityConfig.java
@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 部署

deployment.yaml
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 参数,可以查看详细的自动配置报告,包括哪些配置生效了,哪些没有生效。

❓ 如何解决端口冲突?

application.yml
server:
  port: 8081  # 修改默认端口
  
# 或者使用随机端口
server:
  port: 0

❓ 如何禁用某个自动配置?

Application.java
@SpringBootApplication(exclude = {
    DataSourceAutoConfiguration.class
})
application.yml
spring:
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

❓ 如何查看加载了哪些 Bean?

Application.java
@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

⚠️ 注意

延迟初始化可能会将启动时的错误推迟到运行时,请谨慎使用。

❓ 如何处理跨域问题?

CorsConfig.java
@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);
            }
        };
    }
}