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
相关产品推荐
相关产品推荐

