@@ -17,41 +17,50 @@ import scala.collection.mutable
17
17
*
18
18
* @param injector top level Guice Injector
19
19
*/
20
- class InjectExtImpl (val injector : Injector ) extends Extension
21
-
22
- object InjectExt extends ExtensionId [InjectExtImpl ] with ExtensionIdProvider with InjectExtBuilder {
20
+ class InjectExtImpl (modules : Seq [Module ]) extends Extension with InjectExtBuilder {
23
21
private val manualModules : ThreadLocal [mutable.Set [Module ]] = ThreadLocal .withInitial(
24
22
new java.util.function.Supplier [mutable.Set [Module ]] {
25
23
override def get (): mutable.Set [Module ] = mutable.Set [Module ]()
26
- })
24
+ }
25
+ )
26
+ private var acceptingModules : Boolean = true
27
27
28
28
/**
29
- * Manually add modules to the injector
30
- * All modules must be added prior to creating the ActorSystem
31
- */
32
- def addModules (m : Module * ): InjectExtBuilder = {
29
+ * Manually add modules to the injector
30
+ * All modules must be added prior to creating the ActorSystem
31
+ */
32
+ def addModules (m : Module * ): InjectExtImpl = {
33
+ if (! acceptingModules) throw new UnsupportedOperationException (" injector was already initialized" )
33
34
manualModules.set(manualModules.get() ++ m)
34
35
this
35
36
}
36
37
38
+ lazy val injector : Injector = {
39
+ acceptingModules = false
40
+ try Guice .createInjector(modules ++ manualModules.get: _* )
41
+ finally manualModules.remove()
42
+ }
43
+ }
44
+
45
+ object InjectExt extends ExtensionId [InjectExtImpl ] with ExtensionIdProvider {
46
+
37
47
// internals \\
38
48
39
49
override def createExtension (sys : ExtendedActorSystem ) = {
40
50
import InjectExtBuilder ._
41
51
42
52
val config = sys.settings.config
43
53
val modules = config.getAs[String ](ModuleDiscoveryModeKey ).getOrElse(DefaultModuleDiscoveryModeMode ) match {
44
- case ManualModuleDiscovery => manualModules.get().toList
54
+ case ManualModuleDiscovery => List ()
45
55
case CfgModuleDiscovery => config.getAs[Seq [String ]](CfgModuleDiscoveryKey ).map(_.map(strToModule)).getOrElse(Seq ()).toList
46
56
case SpiModuleDiscovery => ServiceLoader .load(classOf [Module ]).iterator.asScala.toList
47
57
case v => throw new IllegalArgumentException (s " invalid $ModuleDiscoveryModeKey value, $v" )
48
58
}
49
- manualModules.remove()
50
59
51
60
val finalModules = addCfgModule(config) :: modules
52
61
val defaultModules = Seq (Defaults .actorSystem(sys))
53
- val injector = Guice .createInjector(finalModules ++ defaultModules : _* )
54
- new InjectExtImpl (injector )
62
+
63
+ new InjectExtImpl (finalModules ++ defaultModules )
55
64
}
56
65
57
66
override def lookup () = InjectExt
@@ -69,7 +78,7 @@ object InjectExt extends ExtensionId[InjectExtImpl] with ExtensionIdProvider wit
69
78
* Defines the module adding interface on the InjectExt
70
79
*/
71
80
trait InjectExtBuilder {
72
- this : ExtensionId [_] =>
81
+ this : Extension =>
73
82
def addModules (m : Module * ): InjectExtBuilder
74
83
}
75
84
0 commit comments