다양한 의존관계 주입방법
- 생성자 주입
- Setter 주입
- 필드 주입
- 일반 매서드 주입
생성자주입
- 생성자를 통하여 의존관계 주입
- 1번만 호출하는 것이 보장, 불변, 필수 의존관계에 사용
-
**생성자가 1개만 있을 시 @Autowired 생략 가능@Autowired public mainServiceImpl(userRepository userRepository, userPolicy userPolicy) { this.userRepository = userRepository; this.userPolicy = userPolicy; }
Setter 주입
- 수정자 매서드를 통하여 의존관계 주입
- 선택, 변경 가능성이 있는 경우 사용
-
**Autowired의 기본동작은 주입할 대상이 없으면 에러가 발생, required = false로 설정하면 진행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; }
필드주입
- 필드에서 바로 의존관계를 주입
- 외부에서 변경이 불가, 테스트 불편
- 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가 높다.