Spring BootのQualifier

Qualifierの概要

QualifierはSpring Boot固有ではなく、Spring自体の機能です。CDIのQualifierと同様に使用できます。

Qualifier名を指定する

  • @QualifierでBean名を指定します。
  • @Autowired@Qualifierを組み合わせ、特定のBeanを注入します。
  • CDIの@Namedに似ています。

コードの作成

public interface MyInterface {
}
@Component
@Qualifier("hoge")
public class Hoge implements MyInterface {
}
@Component
@Qualifier("fuga")
public class Fuga implements MyInterface {
}
@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        try (ConfigurableApplicationContext context = SpringApplication.run(Main.class, args)) {
            Main m = context.getBean(Main.class);
            System.out.println("hoge = " + m.hoge.getClass());
            System.out.println("fuga = " + m.fuga.getClass());
        }
    }

    @Autowired @Qualifier("hoge")
    private MyInterface hoge;

    @Autowired @Qualifier("fuga")
    private MyInterface fuga;
}

実行結果

hoge = class sample.springboot.Hoge
fuga = class sample.springboot.Fuga

Qualifierを作成する

  • カスタムアノテーションへ@Qualifierを付与してQualifierを作成します。
  • CDIのカスタムQualifierと同様に使用できます。
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface MyQualifier {
    MyType value();
}
public enum MyType {
    HOGE,
    FUGA,
}
@Component
@MyQualifier(MyType.HOGE)
public class Hoge implements MyInterface {
}
@Component
@MyQualifier(MyType.FUGA)
public class Fuga implements MyInterface {
}
@Autowired @MyQualifier(MyType.HOGE)
private MyInterface hoge;

@Autowired @MyQualifier(MyType.FUGA)
private MyInterface fuga;

結果は同じです。各フィールドへ一致するカスタムQualifierのBeanが注入されます。