Spring5 使用するBeanを指定する(@Qualifier)

Spring5の使用するBeanを指定するサンプルです。@Qualifierアノテーションを使用します。

目次

サンプル Spring5 使用するBeanを指定する(@Qualifier)概要
  1.起動するクラス(MainController.java)
  2.設定クラス(TestConfig.java)
  3.beanとインターフェース(Syain,IHello,Hello1,Hello2)
  実行する
  pom.xml

Spring5 使用するBeanを指定する(@Qualifier)概要

今回作成したファイルです。

処理の流れ

・Hello1クラスとHello2クラスは、IHelloインターフェースを実装しています。
・Syainクラスで@Autowiredするとき、変数のデータ型はIHelloなのでHello1またはHello2のどちからを指定する必要があります。
→@Qualifierで指定します。

githubにコードがあります。
https://github.com/ut23405/spring5/tree/master/spring5-qualifier

1.起動するクラス(MainController.java)

package com.example.test1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainController {
	public static void main(String[] args) {

		AnnotationConfigApplicationContext context = 
				new AnnotationConfigApplicationContext(TestConfig.class);

		Syain syain = context.getBean(Syain.class);

		System.out.println(syain.getHello()); //設定により変わる
		context.close();
	}
}

9行目は、設定ファイルからDIコンテナを生成しています。
11行目は、context.getBeanでDIコンテナからbean(インスタンス)を取得しています。

2.設定クラス(TestConfig.java)

package com.example.test1;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("com.example.test1")
public class TestConfig {	
}

@Configurationは、設定クラスであることを示しています。
@ComponentScanは、対象のパッケージ配下にある@Componentが付与されたクラスを探してBeanとしてDIコンテナに登録します。

3.beanとインターフェース(Syain,IHello,Hello1,Hello2)

Syain.java

package com.example.test1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Syain {
	@Autowired
	@Qualifier("test2")
	private IHello obj1;

	public String getHello() {
		return obj1.getHello();
	}
}

8行目は、@Autowiredです。
10行目の変数の型はIHelloインターフェースです。実装しているクラスはHello1とHello2の2つありどちらかを指定する必要があり、その指定する役割が@Qualifierです。
上記例ではHello2クラスの@Component(value = "test2")のtest2を指定しています。
(Hello2クラス参照)

また@Qualifier("test2")を削除した場合は、@Primaryが設定してあるHello1クラスになります。(Hello1クラス参照)

IHello.java

インターフェースです。

package com.example.test1;

public interface IHello {
	public String getHello();
}

Hello1.java

上記インターフェースを実装しています。

package com.example.test1;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

@Component
@Primary
public class Hello1 implements IHello {
	@Override
	public String getHello() {
		return "Hello World!";
	}
}

7行目は、@Primaryアノテーションです。@Qualifierの設定がない場合はこちらのクラスが使用されます。

Hello2.java

上記インターフェースを実装しています。

package com.example.test1;

import org.springframework.stereotype.Component;

@Component(value = "test2")
public class Hello2 implements IHello {
	@Override
	public String getHello() {
		return "こんにちは!";
	}
}

5行目は、@Componetのvalueの値に名称を設定しています。@Qualifierの呼び出しで使用されます。

実行する

MainController.javaを右クリックして「実行」→「Javaアプリケーション」をクリックすると@Qualifierでの設定によりコンソールに"Hello World!"または"こんにちは!"と表示されます。

pom.xml

設定したライブラリです。

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>5.3.7</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>5.3.7</version>
		</dependency>

関連の記事

Spring5 XMLでhello worldを表示
Spring5 Java Configでhello world

△上に戻る