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