의존관계 주입

의존관계 주입

주입 방법 #

생성자 주입 #

  • final OK (누락 X)
  • 변경 가능성 X
  • 최초 1번 실행 보장
  • 생성자 1개 => @Autowired 생략 가능
    • 여러 개, 생략 불가능

세터 주입 #

생성자 이후에 처리 (= final X)

단점

  • Setter Open
  • 변경 가능성
  • final X
  • 선택적 (null OK)

필드 주입 #

생성자 이후에 처리 (= final X)

  • DI Framework 에 의존
    • 테스트할 때, 주입해줄 수 없음.
    • Setter 열어줘야함.
  • final X
  • 선택적 (null OK)
  • * 단, 일부 테스트 코드에서는 OK

일반 메서드 주입 #

생성자 이후에 처리 (= final X)

일반 메서드 통해 주입 OK

  • 잘 사용하지 않음
// 다른 주입과 동일하게, Bean 등록 시 알아서 주입해줌
@Autowired
public void asdasd(MyRepository myRepository) {
    this.myRepository = myRepository;
}


@Autowired(required = false) #

  • 주입 대상 있으면, 주입
  • 주입 대상 없으면, 생략
@Autowired(required = false)
public void setNoBean1(Member member) {
    System.out.println(member); // Member Bean 없으면 이 주입(메서드)는 실행 안됨
}

```java
@Autowired(required = false)
public void setNoBean2(Optional<Member> member) {
    System.out.println(member); // Optional.empty
}

// null 주입
@Autowired
public void setNoBean3(@Nullable Member member) {
    System.out.println(member); // Member Bean 없으면 이 주입(메서드)는 실행 안됨
}


@Primary, @Qualifier #

@Qualifer 시 아래와 같이 사용자 어노테이션 만드는 방법도 있음

무분별하게 사용, 만들지는 말 것

@Qualifier("myDetail1Service")
public @interface MyDetail1Service {

}