You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Guice依赖注入:让Provider返回单例StudentRepository实例

解决Google Guice Provider每次创建新实例的问题

你遇到的核心问题是自定义Provider未设置单例作用域,Guice默认会为每次注入请求创建一个新的Provider实例,导致每个Provider内部的studentRepository变量都会被重置为null,最终每次调用get()都会新建StudentRepository对象,无法复用实例。

方案一:为自定义Provider添加单例注解

修改你的StudentRepositoryTraitProvider类,添加@Singleton注解,确保Guice仅创建一个Provider实例,这样内部的单例逻辑就能生效:

package providers

import com.google.inject.{Provider, Singleton}
import repository.StudentRepositoryTrait
import repository.implementation.StudentRepository

@Singleton
class StudentRepositoryTraitProvider extends Provider[StudentRepositoryTrait] {
  private var studentRepository: StudentRepositoryTrait = null

  override def get(): StudentRepositoryTrait = {
    if (studentRepository == null)
      studentRepository = new StudentRepository

    studentRepository
  }
}

方案二:使用Guice内置单例绑定(推荐)

无需自定义Provider,直接在Module中绑定 trait 到实现类,并指定单例作用域,Guice会自动帮你管理单例实例,更简洁且避免手动单例的线程安全隐患:

修改Module类

package modules

import com.google.inject.AbstractModule
import com.google.inject.Scopes
import repository.StudentRepositoryTrait
import repository.implementation.StudentRepository

class StudentGuiceModule extends AbstractModule {
  override def configure(): Unit = {
    bind(classOf[StudentRepositoryTrait])
      .to(classOf[StudentRepository])
      .in(Scopes.SINGLETON)
  }
}

修改StudentService(可选优化)

既然Guice会注入单例实例,无需再注入Provider,直接注入StudentRepositoryTrait即可:

package service.implementation

import akka.Done
import com.google.inject.Inject
import models.Student
import repository.StudentRepositoryTrait
import service.StudentServiceTrait

class StudentService @Inject() (studentRepositoryTrait: StudentRepositoryTrait) extends StudentServiceTrait {
  def fetchStudent(studentEmail: String): Option[(String, Student)] = {
    studentRepositoryTrait.fetchStudent(studentEmail)
  }

  def saveStudent(student: Student): Done = {
    studentRepositoryTrait.saveStudent(student)
  }
}

内容的提问来源于stack exchange,提问作者Zaryab Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:47:23