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

Springの使用するBeanを指定するサンプルです。
フィールドインジェクションに@Qualifierアノテーションを使用します。
(確認環境:Spring 5.3.7、JDK 11、STS 4)

目次

サンプル Spring 使用するBeanを指定する(@Qualifier)概要
  1.起動するクラス(StartApplication.java)
  2.設定クラス(AppConfig.java)
  3.beanとインターフェース
  4.使用するクラス(SyainService.java)
  pom.xml

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

処理の流れ

・ColorRed,ColorYellow,ColorBlueクラスは、IColorインターフェースを実装しています。
・SyainServiceクラスで@Autowiredするとき、変数のデータ型はIColorなのでColorRed,ColorYellow,ColorBlueのどれかを指定する必要があります。
→@Qualifierで区別できるようにします。

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

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

package com.example.test1;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.example.test1.service.SyainService;

public class StartApplication {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = 
				new AnnotationConfigApplicationContext(AppConfig.class);
		SyainService syain = context.getBean(SyainService.class);
		System.out.println(syain.getColor()); //設定により変わる
		context.close();
	}
}

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

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

package com.example.test1;

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

@Configuration
@ComponentScan("com.example.test1.service")
public class AppConfig {
	@Bean("red")
	IColor getRed() {
		return new ColorRed();
	}
	@Bean("yellow")
	IColor getYellow() {
		return new ColorYellow();
	}
	@Bean
	@Primary
	IColor getBlue() {
		return new ColorBlue();
	}
}

11,15行目は、@Beanの横に文字列は、@Qualifierで指定します。
20行目の@Praimaryは@Qualifierを指定しない場合に選択されます。

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

3.beanとインターフェース

IColor.java

インターフェースです。

package com.example.test1;

public interface IColor {
	public String getColor();
}

ColorRed.java

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

package com.example.test1;

public class ColorRed implements IColor {
	@Override
	public String getColor() {
		return "red";
	}
}

ColorYellow.java

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

package com.example.test1;

public class ColorYellow implements IColor {
	@Override
	public String getColor() {
		return "Yellow";
	}
}

ColorBlue.java

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

package com.example.test1;

public class ColorBlue implements IColor {
	@Override
	public String getColor() {
		return "blue";
	}
}

 

4.使用するクラス(SyainService.java)

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

import com.example.test1.IColor;

@Component
public class SyainService {
	@Autowired
	@Qualifier("red")
	private IColor color;
	
	public String getColor() {
		return color.getColor();
	}
}

12行目の変数の型はIColorインターフェースです。実装しているクラスはColorRed,ColorYellow,ColorBlueと3つありどれかを指定する必要があります。
11行目は、@Qualifierでredを指定しているのでColorRedクラスのbeanになります。

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

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>

関連の記事

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

△上に戻る