Java 如何检索给定域类的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

给定某个类中所有spring数据存储库的列表
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);
    }
}