DevToolBox免费
博客

Spring Boot完整指南:REST API、Spring Data JPA、Security、Actuator和Docker

16 分钟阅读作者 DevToolBox
TL;DR — Spring Boot 快速参考

Spring Boot 是一个固执己见的 Java 框架,消除了配置样板代码。在 pom.xml 中添加 starter,用 @SpringBootApplication 注解主类并运行即可。使用 @RestController + @GetMapping/@PostMapping 构建 REST API,使用 JpaRepository 进行 CRUD 数据库访问,使用 spring-boot-starter-security 保护端点,使用 Actuator(/actuator/health)监控应用,使用 @SpringBootTest + MockMvc 测试,打包为 fat JAR 后通过 java -jar app.jar 运行。

什么是 Spring Boot?

Spring Boot 是基于 Spring Framework 构建的固执己见的 Java 框架, 让创建独立的、生产级 Java 应用变得极为简单。Spring Boot 的核心理念是"合理的默认值"—— 当你添加 spring-boot-starter-web 时,它会自动配置嵌入式 Tomcat、Spring MVC 和 JSON 序列化, 无需任何 XML 配置。

Spring Boot 3.x(需要 Java 17+)是当前主版本,带来了通过 GraalVM 的原生编译支持、改进的可观测性以及 完整的 Jakarta EE 10 兼容性。它为 Netflix、Airbnb、LinkedIn 以及全球数千家企业提供支持。

核心要点
  • Spring Boot 根据类路径依赖自动配置 Bean,无需 XML。
  • Starters 捆绑兼容的库版本:spring-boot-starter-webspring-boot-starter-data-jpa 等。
  • @SpringBootApplication 组合了 @Configuration@EnableAutoConfiguration@ComponentScan
  • 依赖注入优先使用构造函数注入;单构造函数 Bean 的 @Autowired 是可选的。
  • Spring Data JPA 仓库消除了 CRUD 样板代码——继承 JpaRepository 即可免费获得 15+ 个方法。
  • Spring Security 集成 JWT 和 OAuth2;使用 SecurityFilterChain Bean 进行配置。
  • Actuator 在 /actuator/* 暴露健康、指标和管理端点。
  • 打包为 fat JAR 可部署到任何 Java 运行环境,或使用 Docker 容器化。

依赖注入:@Component、@Service、@Repository、@Autowired

Spring 的 IoC(控制反转)容器管理对象的创建和装配。使用注解标记类,Spring 就可以发现并注入它们。

// @Component — 通用 Spring 托管 Bean
@Component
public class EmailValidator {
    public boolean isValid(String email) {
        return email.contains("@");
    }
}

// @Service — 业务逻辑层
@Service
public class UserService {
    private final UserRepository userRepository;

    // 构造函数注入(推荐)
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}

// @Repository — 数据访问层(自动异常转换)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
}

Spring MVC:控制器与 REST API

@RestController 组合了 @Controller@ResponseBody, 所有方法返回的数据会直接序列化为 JSON 响应体。

@RestController
@RequestMapping("/api/v1/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public ResponseEntity<List<UserDto>> getAllUsers() {
        return ResponseEntity.ok(userService.findAll());
    }

    @GetMapping("/{id}")
    public ResponseEntity<UserDto> getUserById(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }

    @PostMapping
    public ResponseEntity<UserDto> createUser(@Valid @RequestBody CreateUserRequest req) {
        return ResponseEntity.status(HttpStatus.CREATED).body(userService.create(req));
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        userService.delete(id);
        return ResponseEntity.noContent().build();
    }
}

Spring Data JPA

定义带 JPA 注解的实体,继承 JpaRepository, 即可零代码获得完整的 CRUD 操作和分页排序功能。

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false, unique = true)
    private String email;

    @CreationTimestamp
    private LocalDateTime createdAt;
    // 构造函数、getter、setter...
}

// 仓库接口 — Spring 自动生成实现
public interface UserRepository extends JpaRepository<User, Long> {
    Optional<User> findByEmail(String email);
    List<User> findByActiveTrue();
    Page<User> findAll(Pageable pageable);

    @Query("SELECT u FROM User u WHERE u.role = :role")
    List<User> findByRole(@Param("role") UserRole role);
}

全局异常处理

使用 @RestControllerAdvice 集中处理异常, 避免在每个控制器中重复 try-catch 代码块。

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<ApiError> handleNotFound(
            ResourceNotFoundException ex, HttpServletRequest request) {
        ApiError error = new ApiError(
            404, "Not Found", ex.getMessage(),
            request.getRequestURI(), LocalDateTime.now()
        );
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(error);
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, Object>> handleValidation(
            MethodArgumentNotValidException ex) {
        Map<String, String> fieldErrors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error ->
            fieldErrors.put(error.getField(), error.getDefaultMessage())
        );
        return ResponseEntity.badRequest().body(Map.of(
            "status", 400,
            "fields", fieldErrors
        ));
    }
}

Spring Security 与 JWT

Spring Security 6 使用基于 Lambda 的 SecurityFilterChain 配置。 实现 JWT 认证需要:JWT 工具类、认证过滤器、安全配置以及认证控制器。

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http,
            JwtAuthFilter jwtAuthFilter) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .sessionManagement(session ->
                session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/api/v1/auth/**").permitAll()
                .requestMatchers("/actuator/health").permitAll()
                .requestMatchers("/api/v1/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder(12);
    }
}

Spring Boot Actuator 监控

Actuator 提供生产就绪的端点,用于健康检查、指标、环境信息等, 并与 Prometheus 和 Micrometer 原生集成。

# 常用 Actuator 端点
GET /actuator/health         # 健康状态
GET /actuator/info           # 应用信息
GET /actuator/metrics        # 所有指标列表
GET /actuator/prometheus     # Prometheus 格式指标
GET /actuator/env            # 环境属性
GET /actuator/loggers        # 当前日志级别

测试:JUnit 5 与 MockMvc

// 控制器切片测试 — 只加载 Web 层
@WebMvcTest(UserController.class)
@AutoConfigureMockMvc(addFilters = false)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserService userService;

    @Test
    void getUser_返回200() throws Exception {
        UserDto user = new UserDto(1L, "张三", "zhang@example.com", LocalDateTime.now());
        when(userService.findById(1L)).thenReturn(user);

        mockMvc.perform(get("/api/v1/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("张三"));
    }
}

Docker 部署

# 多阶段 Dockerfile
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline -q
COPY src ./src
RUN mvn package -DskipTests -q

FROM eclipse-temurin:21-jre-jammy
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
RUN addgroup --system appgroup && adduser --system --ingroup appgroup appuser
USER appuser
EXPOSE 8080
ENTRYPOINT ["java", "-XX:+UseContainerSupport", "-jar", "app.jar"]

总结

Spring Boot 是 2026 年主流的 Java 后端框架,凭借自动配置、完善的生态系统、成熟的安全模型 和完整的测试支持,成为企业 Java 开发的首选。

进阶方向:Spring Cloud Gateway(API 网关)、Spring Batch(批量数据处理)、Spring WebFlux(响应式编程)以及 Spring Cloud(微服务模式: 服务发现 Eureka、配置中心 Config Server、熔断器 Resilience4j)。

𝕏 Twitterin LinkedIn
这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

试试这些相关工具

{ }JSON FormatterJWTJWT DecoderB→Base64 Encoder

相关文章

NestJS完整指南:模块、控制器、服务、依赖注入、TypeORM、JWT认证和测试

从零掌握NestJS。涵盖模块、控制器、服务、Provider、依赖注入、TypeORM/Prisma数据库集成、JWT认证、守卫、管道、拦截器、异常过滤器以及Jest单元测试和e2e测试。

API设计指南:REST最佳实践、OpenAPI、认证、分页和缓存

掌握API设计。涵盖REST原则、版本控制策略、JWT/OAuth 2.0认证、OpenAPI/Swagger规范、速率限制、RFC 7807错误处理、分页模式、ETags缓存以及REST vs GraphQL vs gRPC vs tRPC对比。

数据库设计指南:范式化、ERD、索引、SQL vs NoSQL和性能优化

掌握数据库设计基础。涵盖范式化(1NF-BCNF)、ER图设计、主键/外键、索引策略、SQL vs NoSQL权衡、ACID事务、真实场景数据库模式(电商、博客、社交媒体)以及PostgreSQL性能优化。