CDI 統合

リポジトリインターフェースのインスタンスは通常、コンテナーによって作成されます。Spring Data を使用する場合は、Spring が最も自然な選択です。Spring は、リポジトリインスタンスの作成でドキュメント化されているように、Bean インスタンスを作成するための洗練されたサポートを提供します。バージョン 1.1.0 の時点で、Spring Data JPA には CDI 環境でリポジトリ抽象化を使用できるカスタム CDI 拡張が付属しています。拡張機能は JAR の一部です。有効にするには、クラスパスに Spring Data JPA JAR を含めます。

次の例に示すように、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 EntityManagers 自体を作成できる必要があります。すべての構成は、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();
  }
}