CDI集成
仓库接口的实例通常由容器创建,Spring 是处理 Spring 数据时最自然的选择。Spring 提供了复杂的 bean 实例创建支持,详见《创建仓库实例》一文。自1.1.0版本起,Spring Data JPA自带自定义CDI扩展,允许在CDI环境中使用仓库抽象。该扩展是JAR的一部分。要激活它,可以在你的类路径上加入 Spring Data JPA JAR。
你现在可以通过实现 CDI Producer 来搭建基础设施EntityManagerFactory和实体管理器如下例所示:
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豆,具体如下:
class CdiConfig {
@Produces
@RequestScoped
@PersistenceContext
public EntityManager entityManager;
}
在上述例子中,容器必须能够创建JPA实体管理器本身。配置所做的只是重新导出JPA实体管理器作为CDI豆。
Spring Data JPA CDI 扩展会接收所有可用的数据实体管理器实例作为 CDI 豆子,并在容器请求某仓库类型的豆子时为 Spring Data 仓库创建代理。因此,获取 Spring Data 仓库实例只需声明@Inject性质,如下例所示:
class RepositoryClient {
@Inject
PersonRepository repository;
public void businessMethod() {
List<Person> people = repository.findAll();
}
}