Skip to content

Spring Boot 4 快速入门

1. Spring Boot 概述

1.1 什么是 Spring Boot

Spring Boot 是 Spring 生态系统的核心项目,它简化了 Spring 应用的初始搭建和开发过程,通过约定优于配置的理念,让开发者能够快速创建独立的、生产级别的 Spring 应用。

1.2 Spring Boot 4 新特性

特性说明
Java 17+ 基线最低要求 Java 17
虚拟线程支持默认启用虚拟线程
HTTP Service Clients声明式 HTTP 客户端
GraalVM 原生镜像改进的原生编译支持
可观测性增强Micrometer Tracing 集成
Spring Security 7安全框架升级

1.3 Spring Boot vs Spring

对比项SpringSpring Boot
配置方式XML/注解自动配置
依赖管理手动管理Starter 依赖
内嵌服务器需要外部部署内嵌 Tomcat/Jetty
开发效率较低较高
学习曲线较陡较平缓

2. 快速开始

2.1 创建项目

使用 Spring Initializr 创建项目:

bash
curl https://start.spring.io/starter.zip \
  -d type=maven-project \
  -d language=java \
  -d bootVersion=4.0.0 \
  -d baseDir=myapp \
  -d groupId=com.example \
  -d artifactId=myapp \
  -d name=myapp \
  -d packageName=com.example.myapp \
  -d javaVersion=21 \
  -d dependencies=web,data-jpa,h2 \
  -o myapp.zip

2.2 项目结构

myapp/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/example/myapp/
│   │   │       ├── MyappApplication.java
│   │   │       ├── controller/
│   │   │       ├── service/
│   │   │       ├── repository/
│   │   │       └── entity/
│   │   └── resources/
│   │       ├── application.yml
│   │       ├── static/
│   │       └── templates/
│   └── test/
│       └── java/
│           └── com/example/myapp/
├── pom.xml
└── README.md

2.3 主启动类

java
@SpringBootApplication
public class MyappApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(MyappApplication.class, args);
    }
}

2.4 pom.xml

xml
<?xml version="1.0" encoding="UTF-8"?>
<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
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>4.0.0</version>
        <relativePath/>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>myapp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>myapp</name>
    
    <properties>
        <java.version>21</java.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3. 配置文件

3.1 application.yml

yaml
server:
  port: 8080
  servlet:
    context-path: /api

spring:
  application:
    name: myapp
  
  datasource:
    url: jdbc:h2:mem:testdb
    driver-class-name: org.h2.Driver
    username: sa
    password: 
  
  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    properties:
      hibernate:
        format_sql: true
  
  h2:
    console:
      enabled: true
      path: /h2-console

logging:
  level:
    root: INFO
    com.example: DEBUG
    org.hibernate.SQL: DEBUG

3.2 多环境配置

yaml
# application.yml
spring:
  profiles:
    active: dev

---
# application-dev.yml
server:
  port: 8080

spring:
  datasource:
    url: jdbc:h2:mem:devdb
    username: sa
    password: 

logging:
  level:
    com.example: DEBUG

---
# application-prod.yml
server:
  port: 80

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/proddb
    username: ${DB_USERNAME}
    password: ${DB_PASSWORD}

logging:
  level:
    com.example: INFO

3.3 配置类

java
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    
    private String name;
    private String version;
    private Map<String, String> features = new HashMap<>();
    
    // getters and setters
}
yaml
app:
  name: My Application
  version: 1.0.0
  features:
    feature-a: enabled
    feature-b: disabled

4. Starter 依赖

4.1 常用 Starter

Starter说明
spring-boot-starter-webWeb 开发
spring-boot-starter-data-jpaJPA 数据访问
spring-boot-starter-data-redisRedis 数据访问
spring-boot-starter-security安全框架
spring-boot-starter-validation数据验证
spring-boot-starter-actuator应用监控
spring-boot-starter-test测试框架
spring-boot-starter-aopAOP 支持
spring-boot-starter-mail邮件发送
spring-boot-starter-cache缓存支持

4.2 自定义 Starter

java
@Configuration
@ConditionalOnClass(ExampleService.class)
@EnableConfigurationProperties(ExampleProperties.class)
public class ExampleAutoConfiguration {
    
    private final ExampleProperties properties;
    
    public ExampleAutoConfiguration(ExampleProperties properties) {
        this.properties = properties;
    }
    
    @Bean
    @ConditionalOnMissingBean
    public ExampleService exampleService() {
        return new ExampleService(properties);
    }
}
properties
# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
com.example.ExampleAutoConfiguration

5. 自动配置原理

5.1 @SpringBootApplication

java
@SpringBootApplication
public class MyappApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyappApplication.class, args);
    }
}

// 等价于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class MyappApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyappApplication.class, args);
    }
}

5.2 条件注解

注解说明
@ConditionalOnClass类路径存在指定类
@ConditionalOnMissingClass类路径不存在指定类
@ConditionalOnBean容器中存在指定 Bean
@ConditionalOnMissingBean容器中不存在指定 Bean
@ConditionalOnProperty配置属性满足条件
@ConditionalOnWebApplicationWeb 应用环境
@ConditionalOnExpressionSpEL 表达式为 true

5.3 自定义条件

java
@Configuration
@ConditionalOnProperty(name = "feature.enabled", havingValue = "true")
public class FeatureConfiguration {
    
    @Bean
    public FeatureService featureService() {
        return new FeatureService();
    }
}

6. 开发工具

6.1 spring-boot-devtools

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>
yaml
spring:
  devtools:
    restart:
      enabled: true
      additional-paths: src/main/java
      exclude: static/**,templates/**
    livereload:
      enabled: true
      port: 35729

6.2 热部署配置

yaml
spring:
  thymeleaf:
    cache: false
  freemarker:
    cache: false
  groovy:
    template:
      cache: false

7. 日志配置

7.1 日志级别

yaml
logging:
  level:
    root: INFO
    com.example: DEBUG
    org.springframework.web: DEBUG
    org.hibernate.SQL: DEBUG
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE

7.2 日志文件

yaml
logging:
  file:
    name: logs/application.log
    max-size: 10MB
    max-history: 30
  pattern:
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
    console: "%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) [%thread] %cyan(%logger{36}) - %msg%n"

7.3 使用日志

java
@Slf4j
@Service
public class UserService {
    
    public User findById(Long id) {
        log.debug("Finding user by id: {}", id);
        User user = userRepository.findById(id).orElse(null);
        log.debug("Found user: {}", user);
        return user;
    }
}

8. Actuator 监控

8.1 添加依赖

xml
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

8.2 配置端点

yaml
management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,env,loggers
      base-path: /actuator
  endpoint:
    health:
      show-details: always
    loggers:
      enabled: true
  info:
    env:
      enabled: true

8.3 常用端点

端点说明
/actuator/health健康检查
/actuator/info应用信息
/actuator/metrics指标信息
/actuator/env环境变量
/actuator/loggers日志配置
/actuator/beansBean 列表
/actuator/mappingsURL 映射

8.4 自定义健康检查

java
@Component
public class CustomHealthIndicator implements HealthIndicator {
    
    @Override
    public Health health() {
        int errorCode = check();
        if (errorCode != 0) {
            return Health.down()
                    .withDetail("Error Code", errorCode)
                    .build();
        }
        return Health.up().build();
    }
    
    private int check() {
        return 0;
    }
}

9. 虚拟线程

9.1 启用虚拟线程

yaml
spring:
  threads:
    virtual:
      enabled: true

9.2 Tomcat 虚拟线程

java
@Configuration
public class VirtualThreadConfig {
    
    @Bean
    public TomcatProtocolHandlerCustomizer<?> virtualThreadExecutor() {
        return protocolHandler -> {
            protocolHandler.setExecutor(
                Executors.newVirtualThreadPerTaskExecutor()
            );
        };
    }
}

9.3 异步请求虚拟线程

java
@Configuration
public class AsyncConfig {
    
    @Bean
    public AsyncTaskExecutor applicationTaskExecutor() {
        return new TaskExecutorAdapter(
            Executors.newVirtualThreadPerTaskExecutor()
        );
    }
}

10. 命令行启动

10.1 打包运行

bash
# 打包
mvn clean package

# 运行
java -jar target/myapp-0.0.1-SNAPSHOT.jar

# 指定配置
java -jar target/myapp-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod

# 指定端口
java -jar target/myapp-0.0.1-SNAPSHOT.jar --server.port=9090

10.2 Maven 运行

bash
mvn spring-boot:run

mvn spring-boot:run -Dspring-boot.run.profiles=dev

10.3 Gradle 运行

bash
gradle bootRun

gradle bootRun --args='--spring.profiles.active=dev'

11. 小结

本章学习了 Spring Boot 4 的基础知识:

内容要点
项目创建Spring Initializr、项目结构
配置文件application.yml、多环境配置
Starter常用 Starter、自定义 Starter
自动配置条件注解、配置原理
开发工具devtools、热部署
日志配置日志级别、日志文件
Actuator健康检查、指标监控
虚拟线程启用配置、线程池

下一章将学习 Spring Boot 4 的自动配置原理。