Guiceで複数のInjectorを使う

2018年11月7日

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側では親のすべての機能を呼び出すことができるが、逆は不可。当然だ。