分层架构(Layered Architecture)
定义
分层架构是一种将软件系统划分为多个层次的设计模式,每一层都有其特定的职责和功能。这种架构模式通过将系统分解为不同的抽象层次,使得系统更容易理解、开发和维护。
主要特点
- 层次分明:每一层都有明确的职责和边界
- 单向依赖:上层只能依赖下层,不能反向依赖
- 封装性:每一层都对其上层隐藏实现细节
- 可替换性:每一层都可以被相同接口的其他实现替换
典型分层
表现层(Presentation Layer)
- 负责用户界面和交互
- 处理用户输入和输出
- 展示数据和信息
业务逻辑层(Business Logic Layer)
- 实现核心业务规则
- 处理业务逻辑和流程
- 协调不同组件之间的交互
数据访问层(Data Access Layer)
- 负责数据持久化
- 管理数据库连接和操作
- 提供数据访问接口
实践
Spring Boot 实现示例
1. 项目结构
src/main/java/com/example/demo
├── controller // 表现层
├── service // 业务逻辑层
├── repository // 数据访问层
├── model // 数据模型
└── config // 配置类
2. 各层实现示例
表现层(Controller)
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
@PostMapping
public ResponseEntity<UserDTO> createUser(@RequestBody UserDTO userDTO) {
return ResponseEntity.ok(userService.createUser(userDTO));
}
}
业务逻辑层(Service)
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public UserDTO getUserById(Long id) {
User user = userRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("User not found"));
return convertToDTO(user);
}
@Override
public UserDTO createUser(UserDTO userDTO) {
User user = convertToEntity(userDTO);
User savedUser = userRepository.save(user);
return convertToDTO(savedUser);
}
}
数据访问层(Repository)
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByStatus(UserStatus status);
}
数据模型(Model)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true)
private String email;
// getters, setters, etc.
}
3. 层间通信
- DTO 模式
public class UserDTO {
private Long id;
private String name;
private String email;
// getters, setters
}
- 异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse(ex.getMessage()));
}
}
4. 依赖注入配置
@Configuration
public class AppConfig {
@Bean
public UserService userService(UserRepository userRepository) {
return new UserServiceImpl(userRepository);
}
}
5. 最佳实践建议
- 使用接口定义服务层
public interface UserService {
UserDTO getUserById(Long id);
UserDTO createUser(UserDTO userDTO);
}
- 统一响应格式
public class ApiResponse<T> {
private boolean success;
private T data;
private String message;
// getters, setters
}
- 参数验证
public class UserDTO {
@NotBlank(message = "用户名不能为空")
private String name;
@Email(message = "邮箱格式不正确")
private String email;
}
- 事务管理
@Service
public class UserServiceImpl implements UserService {
@Transactional
public UserDTO createUser(UserDTO userDTO) {
// 业务逻辑
}
}
总结
分层架构是一种经典且实用的软件架构模式,它通过清晰的层次划分和职责分配,帮助开发团队更好地组织和管理代码。虽然它可能不是所有场景的最佳选择,但在大多数企业级应用中,分层架构仍然是一个可靠的选择。
