あるクラスのすべてのSpringデータリポジトリのリストを考えるとBar
:
@Autowired
private List<Repository> repositories;
上記のリストで既存のドメインクラスFoo
のリポジトリを見つけるにはどうすればよいですか?
以下が存在すると仮定します。
@Entity
public class Foo {
...
}
そして
public interface FooRepository extends JpaRepository<Foo, String> {}
Spring DataCommonsにはクラスRepositories
が含まれています。このクラスはListableBeanFactory
を使用して、定義されているすべてのリポジトリBeanを検索し、APIを公開してドメインクラスごとにこれらのインスタンスを取得します(….getRepository(Class<?> type)
を介して) 。
このクラスは注意して使用する必要があります。リポジトリインスタンスに対して深刻なプロキシ生成が行われているため、Repositories
インスタンスがApplicationContext
の作成中にできるだけ遅く作成されるようにする必要があります。推奨される方法は、ApplicationListener
を実装し、ContextRefreshedEvent
をリッスンしてインスタンスを作成することです。
Webアプリケーションを作成している場合、Repositories
を使用する最も安全な方法は、ApplicationContext
によって作成されたContextLoaderListener
にリポジトリをブートストラップし、Repositories
(詳細については、Spring MVCの リファレンスドキュメント を参照してください。
@Service
public class GenericRepository {
@Autowired
private WebApplicationContext appContext;
Repositories repositories = null;
public GenericRepository() {
repositories = new Repositories(appContext);
}
public JpaRepository getRepository(AbstractPersistable entity) {
return (JpaRepository) repositories.getRepositoryFor(entity.getClass());
}
public Object save(AbstractPersistable entity) {
return getRepository(entity).save(entity);
}
public Object findAll(AbstractPersistable entity) {
return getRepository(entity).findAll();
}
public void delete(AbstractPersistable entity) {
getRepository(entity).delete(entity);
}
}
ソリューションの鍵は、メソッドgetDomainType()
を提供するSpringの_org.springframework.data.repository.core.support.DefaultRepositoryMetadata
_です。
DefaultRepositoryMetadata
には、コンストラクターargとしてリポジトリインターフェースが必要です。したがって、既存のすべてのリポジトリをループし、リポジトリインターフェイスを取得して(リポジトリインスタンスには複数のインターフェイスがあるため、まだ注意が必要な部分です)、getDomainType()
が_Foo.class
_に等しいものを見つけることができます。