Java 如何检索给定域类的spring数据存储库实例?
给定某个类中所有spring数据存储库的列表Java 如何检索给定域类的spring数据存储库实例?,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,给定某个类中所有spring数据存储库的列表Bar: @Autowired private List<Repository> repositories; 及 公共接口FooRepository扩展了JpaRepository{} 解决方案的关键是 Spring的org.springframework.data.repository.core.support.DefaultRepositoryMetadata提供了方法getDomainType() DefaultRepository
Bar
:
@Autowired
private List<Repository> repositories;
及
公共接口FooRepository扩展了JpaRepository{}
解决方案的关键是
Spring的org.springframework.data.repository.core.support.DefaultRepositoryMetadata
提供了方法getDomainType()
DefaultRepositoryMetadata
需要存储库接口作为构造函数arg。因此,可以遍历所有现有存储库,检索存储库接口(这仍然是一个棘手的部分,因为存储库实例有多个接口),并找到getDomainType()
等于Foo.class
的接口 Spring Data Commons包含一个类Repositories
,该类使用ListableBeanFactory
查找其中定义的所有存储库bean,并公开一个API以按域类(通过…getRepository(类类型)
)获取这些实例
使用本课程时应小心。由于正在为存储库实例生成一些严重的代理,您必须确保在ApplicationContext
创建过程中尽可能晚地创建Repositories
实例。首选方法是实现ApplicationListener
,并通过侦听ContextRefreshedEvent
创建实例
在编写web应用程序时,使用存储库
最安全的方法是在ContextLoaderListener
创建的ApplicationContext
中引导存储库,然后放置存储库
(有关详细信息,请参阅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);
}
}
public interface FooRepository extends JpaRepository<Foo, String> {}
@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);
}
}