CDI集成

仓库接口的实例通常由容器创建,Spring 是处理 Spring 数据时最自然的选择。Spring 提供了复杂的 bean 实例创建支持,详见《创建仓库实例》一文。自1.1.0版本起,Spring Data JPA自带自定义CDI扩展,允许在CDI环境中使用仓库抽象。该扩展是JAR的一部分。要激活它,可以在你的类路径上加入 Spring Data JPA JAR。spring-doc.cadn.net.cn

你现在可以通过实现 CDI Producer 来搭建基础设施EntityManagerFactory实体管理器如下例所示: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 环境而有所不同。你可能只需要重新申报实体管理器作为CDI豆,具体如下:spring-doc.cadn.net.cn

class CdiConfig {

  @Produces
  @RequestScoped
  @PersistenceContext
  public EntityManager entityManager;
}

在上述例子中,容器必须能够创建JPA实体管理器本身。配置所做的只是重新导出JPA实体管理器作为CDI豆。spring-doc.cadn.net.cn

Spring Data JPA CDI 扩展会接收所有可用的数据实体管理器实例作为 CDI 豆子,并在容器请求某仓库类型的豆子时为 Spring Data 仓库创建代理。因此,获取 Spring Data 仓库实例只需声明@Inject性质,如下例所示:spring-doc.cadn.net.cn

class RepositoryClient {

  @Inject
  PersonRepository repository;

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