Guiceで複数のInjectorを使う
Embedded-Jettyでのクラスアクセスで、Embedded-Jettyを使うコンテナ側とwar側のクラスの呼び出し可能関係はわかった。次に問題になったのは、コンテナ側もwar側もGuiceを使う場合にどうすればよいのかだ。
Injectorを複数作成する
単純に考えれば、別々にGuiceのInjectorを作成することだ。コンテナ側もwar側もそれぞれ、
Injector injector = Guice.createInjector(モジュール);
とやらかして、それぞれ勝手に使うことである。コンテナ側のGuiceライブラリをwar側も流用するにしても、それぞれはうまく行くだろうが、しかしwar側からコンテナ側の機能を呼び出す際には困ったことになる。当然、@Injectで注入してはならないし、@Singletonがシングルトンではなくなってしまう。
ChildInjector
すっかり忘れていたのだが、ChildInjectorという仕組みがあったのだ。よっぽど使われないのだろうか?日本語のページとしてはほとんど以下しか見つからない。
親のインジェクタを作成する。この場合はコンテナ側だが、
parent = Guice.createInjector(モジュール);
war側では、これを静的変数を介して取得し、以下のように子インジェクタを作成するのである。
child = parent.createChildInjector(モジュール);
war側では親のすべての機能を呼び出すことができるが、逆は不可。当然だ。