基礎記事を書こうと思ったけど、すでに素晴らしい記事があったのでリンク集にする。
※リンクを上から見ていけばわかるようにすること。
Spring Boot全体の参考サイト
さらに踏み込んだ内容↓
www.youtube.com
Dependency Injection(依存性の注入)の参考サイト
アノテーション
annotationは注釈という意味。
- @Controller
- @Service
- @Repository
これらのよく見るアノテーションは
Bean化して、DIコンテナに入れるためのアノテーション。
実は@Componetで代用可能。
役割を明示するために@Serviceなどしているが、全部@Componetにしても機能はする?→一度試してみたい。
DIコンテナから呼び出すには?
@Autowiredで呼び出すだけ。
@Repository //Bean化してDIコンテナに格納 public interface SampleRepository { } @Service //Bean化してDIコンテナに格納 public class SampleService { @Autowired //DIコンテナから呼び出し SampleRepository sampleRepository; }
@RepositoryでBeanとしてDIコンテナに格納 → @Autowiredが付与されたクラスにインスタンスが注入される
Beanとは
Javaで言うところのBeanとは再利用可能なデータのこと。
getter stterメソッドが用意されているクラス。
Dependency Injection(依存性の注入)とは
■DIの概要
DIコンテナ=Beanをインスタンス化したものの入れ物
@Component
などでDIコンテナにBeanを格納する
DIコンテナからBeanインスタンスを@Autowired
で取り出す
■DIのメリット
DIしない場合とDIする場合で見比べてみる↓
・DIしないコード例
public class CarController { public Car car() { Device device = new Device(); device.engineOn(); } }
上記のコードだと、carメソッドが呼ばれる度にDeviceクラスのインスタンスが作られる。1万回リクエスト来たら1万個のインスタンスになる。
CarControllerクラスをテストするときに、Deviceクラスが未完成だとテストできない。
・DIするコード例
public class CarController { @Autowired DeviceService devideService; public boolean car() { boolean isEngineOn = devideService.engineOn(); return isEngineOn; } } @Service public class DeviceImpl implements DeviceService { public boolean ebginOn() { if (xxx) { return true; else { return false; } }
DIするとDeviceServiceインタンスは1個しか作られないため、メモリ節約できる。
また、テストのときにDeviceImpl クラスが未完成だったとしても、Mockクラスを作ればテスト可能。