22

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

@Autowired
private List<Repository> repositories;

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

假设存在以下情况:

@Entity
public class Foo {
  ...
}

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

3 回答 3

26

Spring Data Commons 包含一个类,该类Repositories使用 aListableBeanFactory来查找其中定义的所有存储库 bean,并公开一个 API 以通过域类(通过….getRepository(Class<?> type))获取这些实例。

应谨慎使用此类。由于存储库实例正在进行一些重要的代理生成,因此您必须确保在Repositories创建过程中尽可能晚地创建实例ApplicationContext。首选的方式是ApplicationListener通过监听来实现和创建实例ContextRefreshedEvent

如果您正在编写一个 Web 应用程序,最安全的使用方法Repositories引导ApplicationContext由.ContextLoaderListenerRepositories

于 2013-01-13T20:15:14.460 回答
19
@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);
    }
}
于 2015-07-14T10:37:29.990 回答
3

org.springframework.data.repository.core.support.DefaultRepositoryMetadata解决方案的关键是提供方法的Spring getDomainType()

DefaultRepositoryMetadata需要存储库接口作为构造函数 arg。因此,可以遍历所有现有存储库,检索存储库接口(这仍然是一个棘手的部分,因为存储库实例有多个接口)并找到getDomainType()equals的那个Foo.class

于 2013-01-11T10:58:58.297 回答