使用 Koin 注入 Spring Jpa 存储库和 Spring 服务

问题描述 投票:0回答:1

我想在 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()

我应该怎样做?

spring-boot kotlin spring-data-jpa koin
1个回答
0
投票

找到解决办法 通过将 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
,以允许事务操作
© www.soinside.com 2019 - 2024. All rights reserved.