CDI 集成
存储库接口的实例通常由容器创建,在使用 Spring Data 时,Spring 是最自然的选择。Spring 为创建 bean 实例提供了复杂的支持,如创建存储库实例中所述。从版本 1.1.0 开始,Spring Data JPA 附带了一个自定义 CDI 扩展,允许在 CDI 环境中使用存储库抽象。该扩展是 JAR 的一部分。要激活它,请在 Classpath 中包含 Spring Data JPA JAR。
现在,您可以通过为EntityManagerFactory
和EntityManager
,如以下示例所示:
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;
}
在前面的示例中,容器必须能够创建 JPAEntityManagers
本身。所有配置所做的只是重新导出 JPAEntityManager
作为 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();
}
}