虽然 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) PanacheRepositoryActive 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 两层架构:

  1. MailResource (API 层): 接收 /api/send 请求。
  2. MailService (业务层): 处理 Token 刷新和 Gmail API 调用。

这种结构清晰、解耦,既符合 Java 开发者的习惯,也能充分利用 Quarkus 的特性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐