SpringBoot DI(依存性の注入)のサンプル

Spring BootのDI(依存性の注入)のサンプルです。DIは、Dependency injectionの略です。

確認環境
・Spring Boot 2.5
・JDK 11

目次

サンプル 環境
  DI(依存性の注入)のサンプル
  アプリ起動時にインスタンスを取得する
設定ファイル pom.xml

環境

今回作成/修正するファイルは以下の赤枠の部分です。

DI(依存性の注入)のサンプル

1.DIの対象になるクラスを探す→@Service (Syain.java)

package com.example.demo;
import org.springframework.stereotype.Service;

@Service
public class Syain {
	public String getName() {
		return "suzuki";		
	}
}

4行目の@Serviceアノテーションがあるクラスは、DIの対象になりDIコンテナに登録されます。
DIの対象になるアノテーションは他にもありそれらはBeanとも呼ばれます。
6行目のメソッドを実行すると文字列を返します。

DIの対象になるアノテーションでよく使用されるもの

アノテーション 説明
@Service サービスクラスにつけます
@Component DIコンテナに登録する場合につけます
@Controller コントローラークラスにつけます
@Repository DAO(DB)のクラスにつけます

 

2.Springが依存性の注入を行う→@Autowired (MainController.java)

package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MainController {
	
	@Autowired
	Syain syain;
	
	@GetMapping("/test1")
	public String write1() {
		return syain.getName();
	}
}

9行目のAutowiredアノテーションは、Spring Frameworkが、DIコンテナに登録したSyainクラスをnewしてインスタンスを変数syainに設定します。これがDI(依存性の注入)です。

依存とは

MainControllerクラスは、Syainクラスのインスタンスを必要としている。→依存

注入とは

Spring Frameworkが、Syainクラスをインスタンス化してセットする。→注入

結果として制御の反転(Inversion of Control、IoC)になる

依存関係が逆になります。
newの場合:MainControllerクラスがSyainクラスをnewして使う。
DIの場合:MainControllerクラスは、何らかのインスタンスを渡されて使う。→疎結合

利点

・疎結合となり実装の切り替えがやりやすくなります。
bean側にProfileアノテーションをつければ開発時と本番時で使用するクラスを変える等の設定ができます。使用するインスタンスはSpringが注入してくれるので呼び出し元(ここではMainControllerクラス)のコードの変更は不要です。単体テストもモック等の使用が容易になります。

・ScopeアノテーションでBeanのインスタンスのスコープも容易に選択できます。
デフォルトはシングルトンです。都度インスタンス化する場合はprototypeを指定します。

以下は、springのAutowiredアノテーションのリンクです。
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/annotation/Autowired.html

画面に表示する

以下のURLにアクセスすると画面にsuzukiと表示されます。

http://localhost:8080/test1

 

アプリ起動時にインスタンスを取得する

アプリ起動時にインスタンスを取得するサンプルです。

1.@Configurationと@Beanを追加する(Syain.java)

上記サービスのファイルを修正します。

package com.example.demo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Syain {
	@Bean
	public String getName() {
		return "tanaka";		
	}
}

5行目は、@Configurationを追加しました。
7行目は、@Beanを追加しました。@Beanは、Spring起動時に設定の内容を取り込みます。

 

2.起動ファイルを修正(Test1Application.java)

起動のファイルです。11行目を追加しました。

package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@SpringBootApplication
public class Test1Application {

	public static void main(String[] args) {
		ApplicationContext syain = new AnnotationConfigApplicationContext(Syain.class);
		SpringApplication.run(Test1Application.class, args);
	}
}

以下は、teratailのSpringフレームワーク@Beanと@componentの違いのリンクです。
https://teratail.com/questions/68235

以下は、springのConfigurationアノテーションのリンクです。
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

pom.xml

必要なライブラリです。

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

関連の記事

SpringBoot hello worldを表示するサンプル
SpringBoot フォームの値を別画面に渡す
SpringBoot JPAでMySQLにselectするサンプル
SpringBoot AOPのサンプル
SpringBoot JSONの送信と受信のサンプル

△上に戻る