如何在应用程序中访问Play Framework 2.4 guice Injector?

Sae*_*fam 9 java scala guice playframework playframework-2.0

我想在Play Framework 2.4中使用getInstanceGuice Injector类的方法,我该如何访问它?

我已经使用Guice FactoryModuleBuilder实现了一个在运行时返回另一个工厂的工厂!在返回工厂的第二级,我需要访问Play Guice Injector以使用反射而不是@Inject注释来手动获取对象.

Tom*_*mer 16

有很多方法.我用这个.

编辑:这与<= 2.4的Play版本相关:

Play.maybeApplication.map(_.injector.instanceOf[MyProdClass]).getOrElse(new MyDevClass)
Run Code Online (Sandbox Code Playgroud)

要么

Play.current.injector.instanceOf[MyClass]
Run Code Online (Sandbox Code Playgroud)

对于> = 2.5的版本:

import play.api.inject.Injector
import javax.inject.Inject

class MyService @Inject() (injector: Injector) ={
    val myClassInstance = injector.instanceOf[MyClass]
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)


Egr*_*ore 7

Play Framework 2.5.x play.api.Play.current已弃用,DI应始终是首选.因此,获取注入器实例的正确方法是使用:

import play.api.inject.Injector
import javax.inject.Inject

class SomeClassRequiringInjector @Inject() (injector: Injector) { ... }
Run Code Online (Sandbox Code Playgroud)

即使用DI Provider类做这个也适合我:)


Sae*_*fam 5

最好注入Guice注入器:

@Inject
private Injector injector;
Run Code Online (Sandbox Code Playgroud)

或者,您可以将以下代码用于Play Framework Java版本:

Play.application().injector().instanceOf(YourClass.class);
Run Code Online (Sandbox Code Playgroud)


Dev*_*abc 5

除了其他Play 2.5.x解决方案之外,您可能还需要在不使用注入的情况下将Injector插入对象。例如,当您使用Scala单例时,@ inject可能不起作用。

在这种情况下,您可以使用以下命令:

@Singleton
class GlobalContext @Inject()(injector: Injector) {
  GlobalContext.injector = injector
}

object GlobalContext {
  private var injector: Injector = null  
}
Run Code Online (Sandbox Code Playgroud)

使用Guice模块将单例设置为渴望,否则它将不会自动初始化:

// Module.scala
class Module extends AbstractModule {
  override def configure() = {
    // ...

    // Eager initialize Context singleton
    bind(classOf[GlobalContext]).asEagerSingleton()
  }
}
Run Code Online (Sandbox Code Playgroud)