0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SpringBootのDIとは何か?

Last updated at Posted at 2021-01-01

SpringBootのDIとは

・Springのコア機能である。
・クラスの外から依存性(オブジェクト)を注入することで、クラス間の依存関係を解消する
 ことが目的である。
・インスタンスの生成※1とインスタンスのライフサイクルの管理※2を実施してくれる。
 ※1インスタンスを毎回生成してアプリに渡すのか、1回のみ生成してアプリに渡すのかを
   管理してくれる。
 ※2サーブレットの各スコープ(セッションスコープなど)にインスタンスを簡単に登録して
   スコープの有効期限が切れたらインスタンスを破棄してくれる。

DIの実装方法

以下のパターンがある。
・アノテーションベース
・JavaConfig
・xml
・JavaConfig + アノテーション
・xml + アノテーション

アノテーションベースの方が簡単にアプリケーションを作成できるが、JavaConfigだとインスタンスを
生成する際にコンストラクタに渡す値を設定したりというような細かい設定が可能となる
また、本番環境と開発環境でJavaConfigを切替えたるといった細かい切り替えが可能となる
小規模なアプリであればアノテーションベースで作成して、細かい設定などをしたいインスタンスがある場合に、そのインスタンスのみJavaConfigで設定するという方法が望ましい。
xmlでは、JavaConfigと同じ内容をxmlの形式で行う。

DIの中の処理

  1. Springを起動すると、DIコンテナ上で管理するクラスを探す処理(コンポーネントスキャナン)が走る。
  2. DIが管理対象のクラスを見つけた後は、それらのインスタンスを生成して@Autowiredアノテーションがついているフィールドにセットする。

※DIコンテナ上で管理するクラスをBeanという。
・DIコンテナにクラスを登録する方法(アノテーションの場合)
 @Component@Controller@Service@Repositoryなどのアノテーションがついている
 クラスが対象である。
・DIコンテナにクラスを登録する方法(JavaConfigの場合)
 @Configurationを付けたクラスに、DIコンテナに登録したいクラスのインスタンスを返す
  getterを定義して@Beanを付ける。

考察

・xmlとJavaConfigはxmlとjavaの言語の違いがあるだけなので、とりあえずxmlはおいといて、
 アノテーションとJavaConfigの実装方法だけ把握しとけば、xmlでの実装が求められる状況に
 なってもなんとかなりそう。
・詳細設計、製造の経験を多く積んで、ある程度設計の知見を得てからでないとDIのメリットを
 十分に理解できそうにない。
・JavaConfigは、テストパターンが多い場合の作業の効率化に役立ちそう。

補足

@Autowiredを付けられる箇所は以下である。
 ・フィールド変数
 ・コンストラクタの引数
 ・setterの引数

参考文献

・【後悔しないための入門書】Spring解体新書: Spring Boot2で実際に作って学べる!Spring
  Security、Spring JDBC、Spring MVC、Spring Test、Spring MyBatisなど多数解説!
  作者: 田村達也

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?