Spring Boot 한정자(Qualifier)
한정자(Qualifier) 개요
Boot 이라기보다는 하나는 Spring 자체 사용하는 방법이다. Spring에도 CDI의 한정자와 같은 것이 준비되어 있다.
한정자 이름으로 지정
- @Qualifier 어노테이션을 사용하여 빈의 이름을 지정할 수 있다.
- @Autowired와 함께 @Qualifier에 이름을 지정하여 특정 빈을 주입 할 수 있다.
- CDI로 말하면 @Named적인 사용된다.
코드 작성
MyInterface.java
package sample.springboot;
public interface MyInterface {
}
Hoge.java
package sample.springboot;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
@Qualifier("hoge")
public class Hoge implements MyInterface {
}
Fuga.java
package sample.springboot;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
@Component
@Qualifier("fuga")
public class Fuga implements MyInterface {
}
Main.java
package sample.springboot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@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
으로 만든 어노테이션을 부여하여 한정자를 만드는 것이 가능하다.- CDI의 커스텀 qualifier 것과 같은 방식으로 사용할 같다.
코드 작성
MyQualifier.java
package sample.springboot;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.annotation.Qualifier;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.TYPE})
public @interface MyQualifier {
MyType value();
}
MyType.java
package sample.springboot;
public enum MyType {
HOGE,
FUGA,
}
Hoge.java
package sample.springboot;
import org.springframework.stereotype.Component;
@Component
@MyQualifier(MyType.HOGE)
public class Hoge implements MyInterface {
}
Fuga.java
package sample.springboot;
import org.springframework.stereotype.Component;
@Component
@MyQualifier(MyType.FUGA)
public class Fuga implements MyInterface {
}
Main.java
package sample.springboot;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@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 @MyQualifier(MyType.HOGE)
private MyInterface hoge;
@Autowired @MyQualifier(MyType.FUGA)
private MyInterface fuga;
}
결과 확인
콘솔 출력
hoge = class sample.springboot.Hoge
fuga = class sample.springboot.Fuga
최종 수정 : 2017-12-17