Created
October 17, 2015 20:14
-
-
Save saeta/1b61fa344beb137de5ff to your computer and use it in GitHub Desktop.
Governator bootstrap injector binding problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name := "reproGovernator" | |
libraryDependencies += "com.netflix.governator" % "governator" % "1.10.5" | |
libraryDependencies += "com.google.inject" % "guice" % "4.0" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example | |
import javax.inject.Inject | |
import com.google.inject.{Injector, Stage, AbstractModule} | |
import com.netflix.governator.guice.LifecycleInjector | |
import scala.reflect.ClassTag | |
case class Foo(a: String = "") | |
class CommonModule extends AbstractModule { | |
override def configure(): Unit = { | |
bind(classOf[Foo]).toInstance(new Foo("asdf")) | |
} | |
} | |
/** | |
* Similar to Play!'s `play.api.inject.Injector` trait. | |
*/ | |
trait InjectorWrapper { | |
// Make available externally. | |
val guiceInjector: Injector | |
def instanceOf[T: ClassTag]: T | |
def instanceOf[T](clazz: Class[T]): T | |
} | |
class SimpleInjector @Inject() (override val guiceInjector: Injector) extends InjectorWrapper { | |
override def instanceOf[T](implicit classTag: ClassTag[T]) = | |
instanceOf(classTag.runtimeClass.asInstanceOf[Class[T]]) | |
override def instanceOf[T](clazz: Class[T]): T = guiceInjector.getInstance(clazz) | |
} | |
class ComplexInjector @Inject() (override val guiceInjector: Injector, val foo: Foo) extends InjectorWrapper { | |
override def instanceOf[T](implicit classTag: ClassTag[T]) = | |
instanceOf(classTag.runtimeClass.asInstanceOf[Class[T]]) | |
override def instanceOf[T](clazz: Class[T]): T = guiceInjector.getInstance(clazz) | |
} | |
class SimpleModule extends AbstractModule { | |
override def configure(): Unit = { | |
bind(classOf[InjectorWrapper]).to(classOf[SimpleInjector]) | |
install(new CommonModule) | |
} | |
} | |
class ComplexModule extends AbstractModule { | |
override def configure(): Unit = { | |
bind(classOf[InjectorWrapper]).to(classOf[ComplexInjector]) | |
install(new CommonModule) | |
} | |
} | |
object Hello { | |
def main(args: Array[String]): Unit = { | |
val simpleInjectorBld = LifecycleInjector.builder().inStage(Stage.DEVELOPMENT).withModules(new SimpleModule).build() | |
val simpleInjector = simpleInjectorBld.createInjector() | |
val simpleInjectorWrapper = simpleInjector.getInstance(classOf[InjectorWrapper]) | |
println("Simple Injector Wrapper underlying:") | |
println(simpleInjectorWrapper.guiceInjector) | |
println("\nSimple Injector Wrapper underlying parent:") | |
println(simpleInjectorWrapper.guiceInjector.getParent) | |
println("\nSimple Injector parent:") | |
println(simpleInjector.getParent) | |
println("\nSimple injector:") | |
println(simpleInjector) | |
println("\n\n") | |
val complexInjectorBld = LifecycleInjector.builder().inStage(Stage.DEVELOPMENT).withModules(new ComplexModule).build() | |
val complexInjector = complexInjectorBld.createInjector() | |
val complexInjectorWrapper = complexInjector.getInstance(classOf[InjectorWrapper]) | |
println("Complex Injector Wrapper underlying:") | |
println(complexInjectorWrapper.guiceInjector) | |
println("\nComplex Injector Wrapper underlying parent:") | |
println(complexInjectorWrapper.guiceInjector.getParent) | |
println("\nComplex Injector parent:") | |
println(complexInjector.getParent) | |
println("\nComplex Injector:") | |
println(complexInjector) | |
println("\nFoo:") | |
println(complexInjectorWrapper.asInstanceOf[ComplexInjector].foo) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
The output from running this is the following: