CDI 集成
仓库接口的实例通常由容器创建,而在使用 Spring Data 时,Spring 是最自然的选择。Spring 提供了对创建 bean 实例的复杂支持,如 创建仓库实例 文档中所述。从 1.1.0 版本开始,Spring Data JPA 附带了一个自定义的 CDI 扩展,允许在 CDI 环境中使用仓库抽象。该扩展是 JAR 的一部分。要激活它,请在你的类路径中包含 Spring Data JPA JAR。
现在,你可以通过为 EntityManagerFactory
和 EntityManager
实现一个 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();
}
}
必要的设置可能会根据 JavaEE 环境的不同而有所变化。您可能只需要将 EntityManager
重新声明为 CDI bean,如下所示:
class CdiConfig {
@Produces
@RequestScoped
@PersistenceContext
public EntityManager entityManager;
}
在前面的示例中,容器必须能够自己创建 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();
}
}