Quarkus 应用分层架构
在简单的项目中,如果不涉及数据库,我们将采用简化的(API 层): 接收/api/send请求。(业务层): 处理 Token 刷新和 Gmail API 调用。这种结构清晰、解耦,既符合 Java 开发者的习惯,也能充分利用 Quarkus 的特性。
·
虽然 Quarkus 是一个现代的、为云原生设计的 Java 框架,但它并不排斥经典的软件架构模式。事实上,它通过 Jakarta EE 标准(如 JAX-RS 和 CDI)完美支持了我们熟悉的 Controller - Service - DAO 分层模型。
本文将介绍 Quarkus 中的标准分层结构,以及各个组件的对应关系。
1. 概览:Quarkus vs Spring Boot
在 Quarkus 中,各层的名称可能略有不同,但职责是一致的:
| 层级 (Layer) | 职责 (Responsibility) | Spring Boot 术语 | Quarkus 术语 |
|---|---|---|---|
| API 层 | 处理 HTTP 请求/响应,参数校验 | @Controller / @RestController |
@Path (JAX-RS Resource) |
| 业务层 | 核心业务逻辑,事务控制 | @Service |
@ApplicationScoped (CDI Bean) |
| 数据层 | 数据库交互 | @Repository (JPA) |
PanacheRepository 或 Active Record |
| 模型层 | 数据实体定义 | @Entity |
@Entity |
2. 详细分层说明
2.1 API 层 (Resource)
在 Quarkus 中,处理 HTTP 请求的类被称为 Resource(资源)。它等同于 Spring MVC 中的 Controller。
- 技术栈: JAX-RS (Jakarta RESTful Web Services)
- 关键注解:
@Path,@GET,@POST,@Produces,@Consumes - 职责:
- 定义 URL 路由。
- 解析 HTTP 请求体(JSON 等)。
- 调用 Service 层执行业务。
- 返回 HTTP 状态码和数据。
代码示例:
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.inject.Inject;
@Path("/users") // 定义路由前缀
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class UserResource {
@Inject
UserService userService; // 注入业务层
@GET
@Path("/{id}")
public UserDTO getUser(@PathParam("id") Long id) {
return userService.findById(id);
}
}
2.2 业务层 (Service)
业务逻辑层通常是一个简单的 CDI Bean。它负责处理核心业务规则。
- 技术栈: CDI (Contexts and Dependency Injection)
- 关键注解:
@ApplicationScoped(最常用,表示单例),@RequestScoped - 职责:
- 执行复杂的业务计算。
- 调用 DAO 层获取数据。
- 控制事务(使用
@Transactional)。
代码示例:
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.transaction.Transactional;
@ApplicationScoped // 声明这是一个 Service Bean
public class UserService {
private final UserRepository userRepository;
// 推荐:构造函数注入
// 优点:无需 @Inject 注解,代码更纯粹,方便单元测试(不需要 Mock 框架也能手动 new)
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Transactional // 开启事务
public void registerUser(User user) {
// 业务逻辑检查
if (userRepository.findByEmail(user.email) != null) {
throw new ValidationException("Email already exists");
}
userRepository.persist(user);
}
}
2.3 数据层 (Repository / DAO)
Quarkus 提供了 Hibernate ORM with Panache,极大地简化了数据访问代码。它支持两种模式:
模式 A: Repository 模式 (经典做法)
这与 Spring Data JPA 非常相似。你创建一个接口或类,专门负责数据访问。
import io.quarkus.hibernate.orm.panache.PanacheRepository;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class UserRepository implements PanacheRepository<User> {
// PanacheRepository 已经内置了 persist, findById, delete 等方法
// 你可以添加自定义查询方法
public User findByEmail(String email) {
return find("email", email).firstResult();
}
}
模式 B: Active Record 模式 (更简通过)
这是 Quarkus 的特色之一。你可以直接在实体类上进行数据库操作,不再需要单独的 Repository 类。代码更少,更直观。
@Entity
public class User extends PanacheEntity {
public String name;
public String email;
// 静态方法直接查库
public static User findByEmail(String email) {
return find("email", email).firstResult();
}
}
// 在 Service 中调用:
User user = User.findByEmail("test@example.com");
3. 总结
在简单的项目中,如果不涉及数据库,我们将采用简化的 Resource -> Service 两层架构:
MailResource(API 层): 接收/api/send请求。MailService(业务层): 处理 Token 刷新和 Gmail API 调用。
这种结构清晰、解耦,既符合 Java 开发者的习惯,也能充分利用 Quarkus 的特性。
更多推荐



所有评论(0)