从零构建生产级 Java 后端服务
手把手带你从零搭建 Spring Boot 项目,涵盖依赖管理、配置分层、RESTful API 设计、统一异常处理与日志规范,适合初学者快速上手。
Spring Boot 是 Spring 框架的扩展,旨在简化新 Spring 应用的初始搭建和开发过程。它采用"约定优于配置"的理念,通过自动配置和起步依赖,让你可以在几分钟内创建一个可运行的、生产级的 Spring 应用,而无需编写大量的样板代码和 XML 配置。
在开始之前,请确保已安装以下工具:
最简单的方式是使用 Spring Initializr(https://start.spring.io)。选择以下配置:
标准的 Spring Boot 项目采用分层架构,各层职责清晰:
src/main/java/com/example/demo/
├── DemoApplication.java 启动类
├── config/ 配置类
├── controller/ 控制器层(REST API)
├── service/ 业务逻辑层
│ └── impl/ 实现类
├── repository/ 数据访问层
├── entity/ 实体类(ORM 映射)
├── dto/ 数据传输对象
├── exception/ 自定义异常
└── util/ 工具类
src/main/resources/
├── application.yml 主配置文件
├── application-dev.yml 开发环境配置
├── application-prod.yml 生产环境配置
└── static/ 静态资源
Spring Boot 的核心是控制反转(IoC)容器。通过 @Autowired 或构造函数注入,容器会自动装配所需的 Bean:
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found"));
}
}
使用多环境配置文件实现不同环境的差异化管理:
# application.yml(公共配置)
spring:
profiles:
active: dev
application:
name: demo-service
---
# application-dev.yml(开发环境)
spring:
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
---
# application-prod.yml(生产环境)
spring:
datasource:
url: jdbc:mysql://localhost:3306/prod_db
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: validate
使用 @RestControllerAdvice 实现全局异常拦截,保证 API 返回格式统一:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ApiResponse<?>> handleNotFound(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(ApiResponse.error(ex.getMessage(), HttpStatus.NOT_FOUND.value()));
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ApiResponse<?>> handleValidation(MethodArgumentNotValidException ex) {
String message = ex.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.collect(Collectors.joining(", "));
return ResponseEntity.badRequest()
.body(ApiResponse.error(message, HttpStatus.BAD_REQUEST.value()));
}
}
统一使用 SLF4J + Logback,避免直接调用 System.out.println:
@Slf4j
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}")
public ApiResponse<User> getUser(@PathVariable Long id) {
log.info("Fetching user with id: {}", id);
User user = userService.findById(id);
log.debug("User found: {}", user);
return ApiResponse.success(user);
}
}
Spring Boot 应用可以打包为可执行的 JAR 文件,内置 Tomcat,无需外部部署:
# 打包
mvn clean package -DskipTests
# 运行
java -jar target/demo-0.0.1-SNAPSHOT.jar
# 或直接使用 Maven 插件
mvn spring-boot:run