injectMembersはどこまで?
こちらの制御が及ばないところで、勝手にオブジェクトがnewされてしまうことがある。 例えば、フレームワークにクラスだけを渡しておくと、そのフレームワークが勝手にインスタンスを生成する場合がある。
このようなインスタンスに対して後から依存性を注入することができる。
public class Sample { } .... public class Tree { @Inject Sample sample; Tree left; Tree right; public void show() { System.out.println("sample " + sample); if (left != null) left.show(); if (right != null) right.show(); } public static void main(String[]args) { Tree tree = new Tree(); tree.left = new Tree(); tree.right = new Tree(); Injector injector = Guice.createInjector(); injector.injectMembers(tree); tree.show(); } }
実行結果は、
sample test.Sample@e94e92 sample null sample null
となる。つまり、injectMembersに直接指定したインスタンスのメンバーは注入されるが、間接的に参照しているものは無視されてしまう。