스프링 레시피 CH2.4 @Resource와 @Inject를 붙여 POJO 자동 연결 하기

2023. 12. 11. 22:18spring

과제

스프링 전용 @Aurowired 대신, 자바 표준 애너테이션 @Resource, @Inject로 POJO를 자동 연결하여 참조하세요

해결책

@Resource는 이름으로 POJO 레퍼런스를 찾아 연결합니다.

@Inject는 타입으로 POJO 레퍼런스를 찾아 연결합니다.

풀이

@Autowired는 org.springframework.beans.factory.annotation 패키지에 속해있어서 스프링에서만 쓸 수 있다.

자바 진영에서는 동일한 기능의 표준화된 애너테이션이 있다. @Resource, @Inject가 그렇다.

 

2.4.1 @Resource로 POJO 자동 연결하기

타입으로 POJO를 찾아 자동 연결하는 기능은 @Resource나 @Autowired나 마찬가지다

public class SequenceGenerator {
    @Resource
    private PrefixGenerator prefixGenerator
}

 

하지만 타입이 같은 POJO가 여럿일 때 @Autowired는 @Qualifier를 써서 이름으로 다시 POJO를 찾아야 하는 불편함이 있다.

 

@Resource는 기능상 @Autowired와 @Qualifier를 합한 것과 같다

 

 

2.4.2 @Inject로 POJO 자동 연결하기

@Resource와 @Autowired처럼 @Inject도 일단 타입으로 POJO를 찾는다.

public class SequenceGenerator {
    @Inject
    private PrefixGenerator prefixGenerator
}

 

그러나 타입이 같은 POJO가 여럿일 때엔 다른 방법을 사용해야 한다.

@Inject를 이용해 이름으로 자동 연결을 하려면 먼저 POJO 주입 클래스와 주입 지점을 구별하기 위해 커스텀 애너테이션을 작성한다.

@Qualifier
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, })
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface DatePrefixAnnotation {
}

 

(이 커스텀 애너테이션에 붙인 @Qualifier는 스프링의 @Qualifier와 다른 애너테이션이다.)

@DatePrefixAnnotation
public class DatePrefixGenerator implements PrefixGenerator{

}

 

public class SequenceGenerator {

    @Inject @DatePrefixGenerator
    private PrefixGenerator prefixGenerator
}