Java EE/Jakarta EE 三大规范详解:CDI、JPA 与 Bean Validation
一、CDI:Contexts and Dependency Injection(上下文与依赖注入)
1. CDI 简介
CDI 是 Java EE 提供的依赖注入和生命周期管理标准,提供:
- 类型安全的依赖注入机制
- 生命周期与作用域控制
- 拦截器、事件系统、装饰器等扩展功能
2. 常用注解说明
| 注解 | 功能说明 |
|---|---|
@Inject | 注入依赖对象 |
@Named | 定义 Bean 名称,供 EL 表达式使用 |
@ApplicationScoped | 应用作用域,整个应用生命周期 |
@RequestScoped | 每个 HTTP 请求周期一个实例 |
@SessionScoped | 每个 HTTP 会话一个实例 |
@Dependent(默认) | 与注入点生命周期一致 |
@Produces | 生产一个注入对象 |
@Qualifier | 自定义限定符,用于区分同类 Bean |
3. CDI 示例
Bean 类定义
@ApplicationScoped
public class GreetingService {
public String greet(String name) {
return "Hello, " + name;
}
}
使用 @Inject 注入 Bean
@RequestScoped
public class UserController {
@Inject
private GreetingService greetingService;
public void handleRequest() {
System.out.println(greetingService.greet("Alice"));
}
}
使用 @Produces
public class Resources {
@Produces
@RequestScoped
public EntityManager produceEntityManager() {
return Persistence.createEntityManagerFactory("myPU").createEntityManager();
}
}
二、JPA:Java Persistence API(持久化规范)
1. JPA 简介
JPA 是 Java EE 标准 ORM 框架,提供实体映射、对象关系管理、查询语言(JPQL)等。
2. 常用注解说明
| 注解 | 用途说明 |
|---|---|
@Entity | 标识实体类 |
@Table | 指定数据库表名 |
@Id | 主键 |
@GeneratedValue | 主键生成策略 |
@Column | 字段映射属性 |
@ManyToOne / @OneToMany | 关联关系 |
@Transient | 不持久化的字段 |
3. 实体类示例
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
private int age;
// Getters & Setters
}
4. 使用 EntityManager
@ApplicationScoped
public class UserRepository {
@Inject
private EntityManager em;
public User findById(Long id) {
return em.find(User.class, id);
}
public void save(User user) {
em.getTransaction().begin();
em.persist(user);
em.getTransaction().commit();
}
}
三、Bean Validation(JSR 380 / Jakarta Bean Validation)
1. Bean Validation 简介
用于对 Java Bean 属性进行声明式验证,常与 JPA、REST API 结合使用。
2. 常用注解说明
| 注解 | 验证内容 |
|---|---|
@NotNull | 不为 null |
@Size | 字符串/集合长度限制 |
@Min/@Max | 数值最小/最大值 |
@Email | 合法的 Email 格式 |
@Pattern | 匹配正则表达式 |
@Valid | 嵌套验证 Bean |
3. 实体类使用 Bean Validation
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@NotNull
@Size(min = 2, max = 20)
private String name;
@Min(18)
private int age;
@Email
private String email;
}
4. 在资源类中触发验证
@Path("/users")
@RequestScoped
public class UserResource {
@Inject
private UserRepository userRepo;
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response createUser(@Valid User user) {
userRepo.save(user);
return Response.status(201).build();
}
}
5. 全局异常处理(ConstraintViolationException)
@Provider
public class ConstraintViolationMapper implements ExceptionMapper<ConstraintViolationException> {
@Override
public Response toResponse(ConstraintViolationException ex) {
List<String> errors = ex.getConstraintViolations().stream()
.map(cv -> cv.getPropertyPath() + ": " + cv.getMessage())
.collect(Collectors.toList());
return Response.status(Response.Status.BAD_REQUEST)
.entity(errors)
.build();
}
}
四、三者整合示例:用户注册服务
@Path("/register")
@RequestScoped
public class RegistrationResource {
@Inject
private UserRepository repo;
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response register(@Valid User user) {
repo.save(user);
return Response.status(201).entity("User registered!").build();
}
}
完整依赖:
<dependencies>
<!-- CDI -->
<dependency>
<groupId>jakarta.enterprise</groupId>
<artifactId>jakarta.enterprise.cdi-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- JPA -->
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- Bean Validation -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.2</version>
</dependency>
<!-- Hibernate Validator 实现 -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
<!-- H2 数据库(开发用) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.224</version>
</dependency>
</dependencies>
五、小结
| 技术规范 | 主要功能 | 常用场景 |
|---|---|---|
| CDI | 类型安全依赖注入,生命周期管理 | 控制反转、组件解耦 |
| JPA | ORM 映射、JPQL 查询 | 数据持久化、实体建模 |
| Bean Validation | 表达式级校验、嵌套验证 | 表单验证、REST 请求验证 |
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。
「java」更多文章
JAX-RS规范介绍
JAX-RS (Java API for RESTful Web Services)是 Jakarta EE(原 Java EE)提供的一套用于构建 RESTful Web 服务的 API 规范。它定义了一套用于将 Java 类映射为 Web 资源的方法,广泛用于微服务、前后端分离架构和 API 开发。
Jakarta RESTful Web Services介绍
Jakarta RESTful Web Services( )详解 一、简介 是 Jakarta EE 规范的一部分,用于构建符合 REST 架构风格的 Web 服务。
Awesome Java
Contents - Projects - Architecture - Bean Mapping - Build - Bytecode Manipulation - Caching - CLI - Code Analysis - Code Coverage - Code ...