CDI 集成
仓库接口的实例通常由容器创建,在使用 Spring Data 时,Spring 是最自然的选择。Spring 为创建 Bean 实例提供了完善的支持,如创建仓库实例一节所述。自 1.1.0 版起,Spring Data JPA 自带一个自定义 CDI 扩展,允许在 CDI 环境中使用仓库抽象。该扩展包含在 JAR 中。要启用它,只需将 Spring Data JPA 的 JAR 加入 classpath。
现在,您可以通过为 EntityManagerFactory 和 EntityManager 实现一个 CDI 生产者来搭建基础设施,如下例所示:
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();
}
}