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>
関連の記事