CDI 集成

仓库接口的实例通常由容器创建,而在使用 Spring Data 时,Spring 是最自然的选择。Spring 提供了对创建 Bean 实例的完善支持,详情请参见创建仓库实例。从 1.1.0 版本开始,Spring Data JPA 提供了一个自定义的 CDI 扩展,允许在 CDI 环境中使用仓库抽象。该扩展包含在 JAR 包中。要激活此功能,只需将 Spring Data JPA 的 JAR 文件添加到您的类路径中即可。spring-doc.cadn.net.cn

您现在可以通过为 EntityManagerFactoryEntityManager 实现一个 CDI Producer 来设置基础设施,如下例所示:spring-doc.cadn.net.cn

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 即可:spring-doc.cadn.net.cn

class CdiConfig {

  @Produces
  @RequestScoped
  @PersistenceContext
  public EntityManager entityManager;
}

在前面的示例中,容器必须能够自行创建 JPA EntityManagers。所有配置所做的只是将 JPA EntityManager 重新导出为 CDI Bean。spring-doc.cadn.net.cn

Spring Data JPA 的 CDI 扩展会将所有可用的 EntityManager 实例作为 CDI Bean 进行获取,并在容器请求某个仓库类型 Bean 时为其创建一个 Spring Data 仓库的代理。因此,获取 Spring Data 仓库实例只需声明一个 @Inject 注入属性,如下例所示:spring-doc.cadn.net.cn

class RepositoryClient {

  @Inject
  PersonRepository repository;

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