以下のように ControllerA から呼び出される場合と ControllerB で呼び出される場合で DbRepository と InMemoryRepository を呼び出しわけたい。(各Repositoryは共通のインターフェイスを実装している)
- ControllerA#get() → ServiceX#doSomething() → DbRepository#findById()
- ControllerB#get() → ServiceX#doSomething() → InMemoryRepository#findById()
この場合はそれぞれ以下のようにすれば期待する動作になる。
- ServiceA に DbRepository を Inject して “serviceX_forControllerA” と名前をつけたオブジェクトを ControllerA に名前指定して Inject
- ServiceB に InMemoryRepository を Inject して “serviceX_forControllerB” と名前をつけたオブジェクトと ControllerB に名前指定して Inject
ServiceX に Repository を切り替えるコードを入れる事。(FactoryをInjectするのもそういう意味で少し微妙に感じている)
当然 ComponentScan で複数のオブジェクトグラフを作ることはできないので、ここだけ XML か JavaConfig で名前付きのオブジェクトグラフを作らなければならない。
この面倒さが、必要な面倒さなのか、別のやり方で回避できるのか。