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 类定义
1
2
3
4
5
6
|
@ApplicationScoped
public class GreetingService {
public String greet(String name) {
return "Hello, " + name;
}
}
|
使用 @Inject
注入 Bean
1
2
3
4
5
6
7
8
9
10
|
@RequestScoped
public class UserController {
@Inject
private GreetingService greetingService;
public void handleRequest() {
System.out.println(greetingService.greet("Alice"));
}
}
|
使用 @Produces
1
2
3
4
5
6
7
|
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. 实体类示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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. 在资源类中触发验证
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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();
}
}
|
四、三者整合示例:用户注册服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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();
}
}
|
完整依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<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 请求验证 |