我想用自定义实现扩展一个 JpaRepository
,所以我添加了一个 MyRepositoryCustom
接口(interface)和一个扩展该接口(interface)的 MyRepositoryImpl
类。
有没有办法在我的自定义类中从 JpaRepository
调用方法?
注意:这也作为对 https://stackoverflow.com/a/11881203/40064 的评论被问及, 但我认为这很常见,值得单独提出一个问题。
最佳答案
tl;dr
要将核心存储库接口(interface)注入(inject)自定义实现,请注入(inject) Provider<RepositoryInterface>
进入自定义实现。
详情
实现该功能的核心挑战是正确设置依赖注入(inject),因为您将要在要扩展的对象和扩展之间创建循环依赖。然而,这可以通过以下方式解决:
interface MyRepository extends Repository<DomainType, Long>, MyRepositoryCustom {
// Query methods go here
}
interface MyRepositoryCustom {
// Custom implementation method declarations go here
}
class MyRepositoryImpl implements MyRepositoryCustom {
private final Provider<MyRepository> repository;
@Autowired
public MyRepositoryImpl(Provider<MyRepository> repository) {
this.repository = repository;
}
// Implement custom methods here
}
这里最重要的部分是使用 Provider<MyRepository>
这将导致 Spring 为该依赖项创建延迟初始化的代理 ,即使它正在为 MyRepository
创建实例首先。在自定义方法的实现中,您可以使用 ….get()
访问实际的 bean。 -方法。
Provider
是来自 @Inject
的接口(interface)JSR,因此是一个标准化的接口(interface),需要对该 API JAR 的额外依赖。如果你只想坚持使用 Spring,你可以使用 ObjectFactory
作为替代界面,但获得完全相同的行为。
关于java - 如何从自定义实现中引用 'normal' spring 数据仓库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28361275/