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)
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类做这个也适合我:)
最好注入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)
除了其他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)