给出某个类Bar
中所有spring数据存储库的列表:
@Autowired
private List<Repository> repositories;
如何在上面的列表中找到现有域类Foo
的存储库?
假设存在以下内容:
@Entity
public class Foo {
...
}
和
public interface FooRepository extends JpaRepository<Foo, String> {}
答案 0 :(得分:24)
Spring Data Commons包含一个类Repositories
,它使用ListableBeanFactory
查找其中定义的所有存储库bean,并公开API以通过域类(通过….getRepository(Class<?> type)
)获取这些实例。
应谨慎使用本课程。由于存储库实例正在进行一些严格的代理生成,因此您必须确保在Repositories
创建期间尽可能晚地创建ApplicationContext
实例。首选方法是实现ApplicationListener
并通过监听ContextRefreshedEvent
来创建实例。
如果您正在编写Web应用程序,使用Repositories
的最安全方法是引导ApplicationContext
创建的ContextLoaderListener
中的存储库并放置Repositories
(有关详细信息,请参阅Spring MVC的reference documentation。
答案 1 :(得分:14)
@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);
}
}
答案 2 :(得分:3)
解决方案的关键是
Spring的org.springframework.data.repository.core.support.DefaultRepositoryMetadata
提供方法getDomainType()
。
DefaultRepositoryMetadata
需要存储库接口作为构造函数arg。因此,可以遍历所有现有存储库,检索存储库接口(这仍然是一个棘手的部分,因为存储库实例具有多个接口)并找到getDomainType()
等于Foo.class
的存储库接口。