暇な日々にスパイスを

学んだ技術の備忘録

Spring Boot 5 AutowiredとDI

Dependency Injection(DI)の話です。

SpringBootではAutowiredとアノテーションを記述することで自動でDIを行えます。
ですが、まずDIって何?利点は何なのか?ということを説明していきたいと思います。

まず、前回のソースです。
f:id:snona:20160216052104p:plain
ここではSampleServiceの前に@Autowiredを記述しています。
しかし、SampleServiceクラスを使うと記載して、SampleServiceクラスがそのまま注入されるのであれば、何も嬉しくありません。
newして入れるのと大差が無いです。

そこで、SampleServiceを以下のように変更します f:id:snona:20160216052115p:plain
SampleServiceクラスをインターフェイスに変更しています。
このままでは動作しないので、インターフェイスを実装したクラスを作成します。

f:id:snona:20160216052213p:plain
SampleServiceインターフェイスを実装したSampleServiceMockクラスを作成しました。

この時のSampleServiceを呼び出しているクラスの@Autowiredと宣言はそのままです。 f:id:snona:20160216052104p:plain

これを実行すると、以下のようになります。
f:id:snona:20160216052358p:plain
f:id:snona:20160216052406p:plain

@Autowiredで指定したクラスがインターフェイスの場合、それを実装しているクラスを自動で注入してくれます。
今回はMockとしていますが、後々にImpleという名前のクラスで処理を本実装した場合でも、SampleServiceを呼び出しているクラスには影響がありません。
これがSpringBootのDIです。

後は、DIらしくPGはモックで、PT時はテスト用のモックで、IT時は本実装されたクラスで、とすれば、開発がやりやすくなるはずです。

なお、インターフェイスを実装したクラスが複数ある場合、起動時にRuntimeExceptionが発生するので注意しましょう。