SpringBootでDIを使ってサンプルコードを作ってみる

1.DIの実践的な使い方を理解するために、まずはDIを使わないサンプルを示す 2.次にDIを使うが実践的でない使う意味の無いサンプルを示す 3.最後にDIを使い本番クラスと開発クラスを切り替える現場で必須のサンプルを示す   DIのメリットは『依存を薄める』と書いてある文献が多いが、現場では依存を薄めてもまったく意味がないと思われる。これが完全に切り離せるなら大きな意味がある。 DIのメリットは本番プログラムと開発プログラムの切り替えが簡単にできると言うことだ。 ※プログラム内で本番の判定を行い切り替える様なコードを書くのは、可読性は非常によろしいがプログラム内の至る箇所に同様の判定を記述しないといけなくなる。また、本番・開発の切り替えだけではなく四半期や月次処理なども特別な判定を入れなくても実行ロジックを簡単に切り替えられる。 1.DIの実践的な使い方を理解するために、まずはDIを使わないサンプルを示す Spring Tool Suite4を使って基本プロジェクトを作成する。 ・以下の様にパッケージとクラスを作成する。 ・コードを書く
■Artist.java
package com.example.demo.di; public interface Artist { String getFirstAlbumName();//ファーストアルバム名を返す }
 
■LedZeppelin.java
package com.example.demo.di; public class LedZeppelin implements Artist { @Override public String getFirstAlbumName() {//ファーストアルバム名を返す return “Led Zeppelin1”; } }
 
■ShowAlbum.java
package com.example.demo.di; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping(“/”) public class ShowAlbum { @RequestMapping(“/album”) public String album(Model model){

//①この意味はインタフェースで変数を作成し実装クラスをその変数に代入している

Artist artist = new LedZeppelin();

String str = artist.getFirstAlbumName();

model.addAttribute(“albumName”,str);

return “/album”;

}

}
インタフェースを使っている理由はこの鉄板のデザイン・パターンの為。 例えばEricClaptonクラスを作成すれば、Artist artist = new EricClapton();この1行のみを変更するだけで、これ以降artist変数はEricClaptonとして振る舞う。 ・アプリを起動する ・画面表示する
http://localhost:8080/album
  2.次にDIを使うが実践的でない使う意味の無いサンプルを示す ・ShowAlbum.javaを以下の様に書き換える
■ShowAlbum.java
package com.example.demo.di; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping(“/”) public class ShowAlbum {    @Autowired //このアノテーションでartistにLedZeppelinが代入される    private Artist artist; @RequestMapping(“/album”) public String album(Model model){       //Artist artist = new LedZeppelin();  //削除 String str = artist.getFirstAlbumName(); model.addAttribute(“albumName”,str); return “/album”; } }
  ・LedZeppelin.javaを以下の様に書き換える
■LedZeppelin.java
package com.example.demo.di; import org.springframework.stereotype.Component; @Component//このアノテーションでDIで管理される public class LedZeppelin implements Artist { @Override public String getFirstAlbumName() {//ファーストアルバム名を返す return “Led Zeppelin1”; } }
  ・画面表示する
http://localhost:8080/album
  3.最後にDIを使い本番クラスと開発クラスを切り替える現場で必須のサンプルを示す ・LedZeppelin.javaを以下の様に書き換える
■LedZeppelin.java
package com.example.demo.di; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @Profile(“default”)//Profileアノテーションで本番用defaultとして本番識別する public class LedZeppelin implements Artist { @Override public String getFirstAlbumName() {//ファーストアルバム名を返す return “Led Zeppelin1”; } }
・パッケージ com.example.demo.testを作成する ・そのパッケージにテスト用のLedZeppelin.javaを作成する
■テスト用のLedZeppelin.java
package com.example.demo.test; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @Profile(develop)//Profileアノテーションでテスト用developとしてテスト識別する public class LedZeppelin implements Artist { @Override public String getFirstAlbumName() {//ファーストアルバム名を返す return “Test”; } }
・application.propatiesに以下を追加する(↓はテストクラスが動く)
■application.propaties
spring.profiles.active=develop
  ・こんな感じになる   ・画面を表示する。(Testが表示される)   以上