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