다양한 의존관계 주입 방법
옵션 처리
@Autowired만 사용하면 required 옵션의 기본값이 true로 되어 있어 자동 주입 대상이 없으면 오류 발생
자동 주입 대상을 옵션으로 처리하는 방법
@Autowired(required=false): 자동 주입할 대상이 없으면 수정자 메소드 자체가 호출되지 않음@Nullable: 자동 주입할 대상이 없으면 null 입력Optional<>: 자동 주입할 대상이 없으면 Optional.empty 생성자 주입 선택
최근에는 스프링을 포함한 DI 프레임워크 대부분이 생성자 주입을 권장
setXxx 메소드를 public으로 열어두어야 한다생성자 주입을 사용하면 주입 데이터를 누락했을 때 컴파일 오류가 발생한다
final 키워드: 생성자 주입을 사용하면 필드에 final키워드를 사용할 수 있다. 생성자에서 혹시라도 값이 설정되지 않는 오류를 컴파일 시점에 막아준다조회 빈이 2개 이상인 경우
해결 방법
@Autowired 필드명 매칭기존 코드
@Autowired private DiscountPolicy discountPolicy필드명을 빈 이름으로 변경
@Autowired private DiscountPolicy rateDiscountPolicy
필드명이
rateDiscountPolicy이므로 정상 주입된다
필드명 매칭은 먼저 타입 매칭을 시도하고 그 결과에 여러 빈이 있을 경우 추가로 동작한다
@Qualifier -> @Qualifier끼리 매칭 (빈 이름 매칭)빈 등록시
@Qualifier를 붙여준다@Component @Qualifier("mainDiscountPolicy") public class RateDiscountPolicy implements DiscountPolicy{}
- 주입시에
@Qualifier를 붙여주고 등록한 이름을 적어준다@Qualifier는@Qualifier를 찾는 용도로만 사용 권장
@Primary 사용
@Autowired시 여러 빈이 매칭되면@Primary가 우선권을 가진다@Component @Primary public class RateDiscountPolicy implments DiscountPolicy{} @Component public class FixDiscountPolicy implments DiscountPolicy{}
우선순위
@Primary는 기본값처럼 동작@Qualifier는 상세하게 동작@Qualifier가 우선권이 높다