我想在 Spring Boot 3 项目中使用 koin 作为我的主要依赖注入库,但我不知道如何从其接口初始化 Jpa 存储库的实例。
说我有这个
interface AccountRepository : JpaRepository<Account, UUID> {
fun findAccountByEmail(email: String): Account?
fun findAccountByPhoneNumber(phoneNumber: String): Account?
}
我想将其添加到单例中
val repositories = module {
single <AccountRepository> { /* I Don't know what to put here */ }
}
这样我以后就可以像这样注射
var accountRepo: AccountRepository by inject()
我应该怎样做?
找到解决办法 通过将 EntityManager 传递给负责从 SpringBoot 应用程序创建存储库的模块,如下所示:
@SpringBootApplication
class Application
fun main(args: Array<String>) {
val context = runApplication<Application>(*args)
startKoin {
modules(
GenericModules,
RepositoriesModule(context.getBean(EntityManager::class.java))
)
}
}
我能够做到这一点
val RepositoriesModule: (EntityManager) -> Module = { entityManager ->
module {
factory<AccountRepository> {
JpaRepositoryFactory(entityManager).getRepository(AccountRepository::class.java)
}
factory<SessionRepository> {
JpaRepositoryFactory(entityManager).getRepository(SessionRepository::class.java)
}
}
}
然后注入它们,如下所示:
val accountRepository: AccountRepository by inject(AccountRepository::class.java)
@Transactional
,以允许事务操作