如何检索给定域类的spring数据存储库实例?

给出某些类Bar中所有spring数据存储库的列表:

 @Autowired private List repositories; 

如何在上面的列表中找到现有域类Foo的存储库?

假设存在以下内容:

 @Entity public class Foo { ... } 

 public interface FooRepository extends JpaRepository {} 

Spring Data Commons包含一个类Repositories ,它使ListableBeanFactory查找在其中定义的所有存储库bean,并公开API以通过域类获取这些实例(通过….getRepository(Class type) )。

应谨慎使用本课​​程。 由于存储库实例正在进行一些严格的代理生成,因此必须确保在ApplicationContext创建期间尽可能晚地创建Repositories实例。 首选方法是实现ApplicationListener并通过侦听ContextRefreshedEvent来创建实例。

如果您正在编写Web应用程序,使用Repositories的最安全方法是通过引导ContextLoaderListener创建的ApplicationContextRepositories并放置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); } } 

解决方案的关键是Spring的org.springframework.data.repository.core.support.DefaultRepositoryMetadata ,它提供了方法getDomainType()

DefaultRepositoryMetadata需要存储库接口作为构造函数arg。 因此,可以遍历所有现有存储库,检索存储库接口(这仍然是一个棘手的部分,因为存储库实例具有多个接口)并找到getDomainType()等于Foo.class的存储库接口。