如何检索给定域类的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
创建的ApplicationContext
的Repositories
并放置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
的存储库接口。