Kotlin

Spring Boot 勉強メモ(DI)

Kotlin サーバーサイドプログラミング実践開発の著書の勉強用メモです。

Spring Framework のDIについて

DI=依存性の注入

各クラスで使用するオブジェクトの生成を自動化してくれる優れもの
DI対象クラス(インターフェース)を作成し、利用したいクラスにSpringFrameworkが定めた方法に則れば意識せずにシングルトンで使える。

呼び方はいくつかあり、3つ紹介されています。

  • コンストラクタインジェクション
  • フィールドインジェクション
  • セッター(setter)インジェクション

インジェクション方法

前提

DI対象インターフェースを作成し、インターフェースをクラスで継承(DI対象クラス)
DI対象クラスには「@Component」アノテーションを付ける

利用するクラスで呼ぶ際にはDI対象インターフェースの名前を使う
あとはそれに紐付くDI対象クラスが呼ばれる。

interface DI対象インターフェース{
  fun メソッド(name: String): String
}
@Component
class DI対象クラス : DI対象インターフェース{
  override fun メソッド(name: String): String = "Hello World!!!"
}

コンストラクタインジェクション

コンストラクタ内に記載する方法
一般的にはコンストラクタインジェクションを使うとのこと。

class 利用するクラス(private val 変数: DI対象インターフェース){
  処理
}

フィールドインジェクション

利用するクラス内のフィールドに定義する方法
@Autowiredアノテーションを使用

class 利用するクラス{
  @Autowired
  private lateinit var 変数: DI対象インターフェース
  以下省略
}

「val」ではなく、「lateinit var」を使う。

セッター(setter)インジェクション

カスタムsetterの中に利用する方法
@Autowiredアノテーションを利用する方法は上記のフィールドインジェクションと変わらず。

class 利用するクラス{
  var 変数: DI対象インターフェース? = null
        @Autowired
        set(value){ field = value }
}

複数クラスから同じインターフェースが呼ばれる場合

複数のクラスから同じインターフェースに呼ばれる場合は@Componentアノテーションに名前を付ける
利用するクラス上では「@Qualifier(名前)」をコンストラクタか@Autowiredアノテーションの前に付ける

interface DI対象インターフェース{
  fun メソッド(name: String): String
}
@Component("Component1")
class DI対象クラス : DI対象インターフェース{
  override fun メソッド(name: String): String = "Hello World!!!"
}

@Component("Component2")
class DI対象クラス : DI対象インターフェース{
  override fun メソッド(name: String): String = "Hello World!!!"
}
class 利用するクラス(@Qualifier("Component1") private val 変数: DI対象インターフェース){
  処理
}

途中までですが

Kotlinにはずっと興味がありJavaと互換性があるならサーバーサイドにも使えるのでは無いかと考えていました。
そういった考えに対する書籍なので非常に助かっています。