본문 바로가기

Spring

의존관계 주입

다양한 의존관계 주입방법

  1. 생성자 주입
  2. Setter 주입
  3. 필드 주입
  4. 일반 매서드 주입

생성자주입

  • 생성자를 통하여 의존관계 주입
  • 1번만 호출하는 것이 보장, 불변, 필수 의존관계에 사용
  • @Autowired
    public mainServiceImpl(userRepository userRepository, userPolicy userPolicy) {
      this.userRepository = userRepository;
      this.userPolicy = userPolicy;
    }
    **생성자가 1개만 있을 시 @Autowired 생략 가능

Setter 주입

  • 수정자 매서드를 통하여 의존관계 주입
  • 선택, 변경 가능성이 있는 경우 사용
  • Setter 주입
    @Autowired(required = false)//주입할 대상이 없어도 진행을 위해 false
    public void setUserRepository(UserRepository userRepository) {
      System.out.println("setter userRepository = " + userRepository);
      this.userRepository = userRepository;
    }
    
    @Autowired
    public void setUserPolicy(UserPolicy userPolicy) {
      System.out.println("setter userPolicy = " + userPolicy);
      this.userPolicy = userPolicy;
    }
    **Autowired의 기본동작은 주입할 대상이 없으면 에러가 발생, required = false로 설정하면 진행

필드주입

  • 필드에서 바로 의존관계를 주입
  • 외부에서 변경이 불가, 테스트 불편
  • DI 프레임워크 아니면 자동으로 사용 불가(자바 코드에서 테스트 시, 추가로 의존관계를 주입해줘야한다.)
  • //filed injection is not recommand
    @Autowired private UserRepository userRepository;
    @Autowired private UserPolicy userPolicy;
    ** 추천하지 않는다.

일반 매서드 주입

  • 매서드를 통하여 주입
  • 여러 필드 주입 가능, 매개변수가 스프링 컨테이너에 관리가 되어야만 주입이 가능
  • //일반 매서드 주입, 매개변수가 스프링컨테이너가 관리하는 스프링 빈이여야만 된다.
    @Autowired
    public void init(UserRepository userRepository, UserPolicy userPolicy){
      this.userRepository = userRepository;
      this.userPolicy = userPolicy;
    }

 

조회시 2개 이상의 빈이 등록되는 경우

@Autowired는 Type으로 우선 조회

  • Type으로 매칭
  • Type 매칭 실패시 parameter 이름으로 매칭한다.

조회시 2개 이상의 빈이 등록 되어있으면 NoUniqueBeanDefinitionException 에러 발생

 

해결

  • @Autowired 필드명 매칭
    • 필드명을 parameter 이름으로 주어준다.
    • 소스 수정시 수정을 해줘야하는 단점 발생
  • @Qualifier -> 지정해준 이름으로 매칭
    • @Qualifier("mainUserPolicy")
    • 생성자에 주입을 해줄때에도 @Qualifier을 써줘야 한다.
  • @Primary
    • 우선 순위를 매김

 

** 우선순위는 primary보다 Qualifier가 높다.

'Spring' 카테고리의 다른 글

싱글톤 패턴  (0) 2022.08.23
빈 생명주기 콜백  (0) 2022.07.12
컨테이너  (0) 2022.06.19