Autowried


다양한 의존관계 주입


  • 생성자 주입
  • 수정자 주입(setter 주입)
  • 필드 주입
  • 일반 메서드 주입

    생성자 주입

    private final MemberRepository memberRepository;
    private final DiscountPolicy discountPolicy;
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
      this.memberRepository = memberRepository;
      this.discountPolicy = discountPolicy;
    }
    
  • final 키워드를 통해 만약 내가 실수하여 코드를 작성하지 않았더라도 바로 컴파일 에러가 발생하게 해준다.

  • 대부분의 의존관계 주입은 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. 오히려 대부분의 의존관계는 애플리케이션 종료 전까지 변하면 안된다.(불변의 원치)

  • 누군가 실수로 변경할 수 도 있고, 변경하면 안되는 메서드를 열어두는 것은 좋은 설계 방법이 아니다.

조회 빈이 2개 이상일 때


    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

만약 ac.getbean(memberRepository.class)의 빈이 2개라면 어떻게 될까?

NoUniqueBeanDefinitionException: No qualifying bean of type

바로 에러메시지가 출력된다.

해결방법

  • 필드명
  • @Qaulifier
  • @Primary

필드명

private MemberRepository memoryMemberRepository;

빈 조회는 여러 빈 들이 있을 때 필드 이름, 파라미터 이름으로 다시 찾는다. 그러므로 필드명을 원하는 빈의 이름으로 수정하여 등록한다.

Qualifier

@Component
@Qualifier("abc")
public class MemoryMemberRepository implements MemberRepository{}

...

@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("abc") MemberRepository memberRepository) {}

별명을 지어주듯이 지정된 이름을 @Autowired에 지정해준다.

Primary

@Component
@Primary
public class RateDiscountPolicy implements DiscountPolicy {}

@Autowired부분에 수정없이 @Component부분에 @Primary 애노테이션을 붙여 설정해준다.

Primary와 Qualifier

primary는 쉽고 간결하며 Qualifier는 세세하다. 두개 같이 사용한다면 Qualifier가 더 우선권이 있어 Qualfier를 더욱 우선시 한다.




© 2019.04. by salmon2

Powered by theorydb