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

时间:2013-01-10 19:50:16

标签: java spring jpa spring-data spring-data-jpa

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

@Autowired
private List<Repository> repositories;

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

假设存在以下内容:

@Entity
public class Foo {
  ...
}

public interface FooRepository extends JpaRepository<Foo, String> {}

3 个答案:

答案 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的存储库接口。