跳到主要内容

CDI 集成

DeepSeek V3 中英对照 CDI Integration

仓库接口的实例通常由容器创建,而在使用 Spring Data 时,Spring 是最自然的选择。Spring 提供了对创建 bean 实例的复杂支持,如 创建仓库实例 文档中所述。从 1.1.0 版本开始,Spring Data JPA 附带了一个自定义的 CDI 扩展,允许在 CDI 环境中使用仓库抽象。该扩展是 JAR 的一部分。要激活它,请在你的类路径中包含 Spring Data JPA JAR。

现在,你可以通过为 EntityManagerFactoryEntityManager 实现一个 CDI Producer 来设置基础设施,如下例所示:

class EntityManagerFactoryProducer {

@Produces
@ApplicationScoped
public EntityManagerFactory createEntityManagerFactory() {
return Persistence.createEntityManagerFactory("my-persistence-unit");
}

public void close(@Disposes EntityManagerFactory entityManagerFactory) {
entityManagerFactory.close();
}

@Produces
@RequestScoped
public EntityManager createEntityManager(EntityManagerFactory entityManagerFactory) {
return entityManagerFactory.createEntityManager();
}

public void close(@Disposes EntityManager entityManager) {
entityManager.close();
}
}
java

必要的设置可能会根据 JavaEE 环境的不同而有所变化。您可能只需要将 EntityManager 重新声明为 CDI bean,如下所示:

class CdiConfig {

@Produces
@RequestScoped
@PersistenceContext
public EntityManager entityManager;
}
java

在前面的示例中,容器必须能够自己创建 JPA 的 EntityManager。所有的配置所做的只是将 JPA 的 EntityManager 重新导出为 CDI bean。

Spring Data JPA CDI 扩展会获取所有可用的 EntityManager 实例作为 CDI bean,并在容器请求仓库类型的 bean 时为 Spring Data 仓库创建一个代理。因此,获取 Spring Data 仓库的实例只需声明一个 @Inject 属性,如下例所示:

class RepositoryClient {

@Inject
PersonRepository repository;

public void businessMethod() {
List<Person> people = repository.findAll();
}
}
java