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が注入されます。