FireDrago

[Spring] 의존성 자동주입 본문

프로그래밍/Spring

[Spring] 의존성 자동주입

화이용 2024. 1. 9. 13:03

의존성 자동주입

 

의존성은 한 클래스에서 다른 클래스를 사용하는 것을 말한다. 

스프링은 의존성을 자동으로 주입할 수 있다. 스프링은 스프링 빈의 형태로 미리 객체를 생성하고 그때 그때 필요한 의존성을 주입한다. 그 방법은 크게 3가지가 있다.  

필드 주입 - 테스트 코드 작성 외에는 사용하지 말자!
수정자 주입 (setter) - 의존성 주입 이후에도 외부에서 의존성 변경 가능성 있음, 
- 의존성이 가변적이고, 필수가 아닐때만 사용하자 
생성자 주입 - 생성자 주입을 사용하자
- 순수 자바코드로 테스트 할 수 있고, 불변선언 (final)이 가능하며,  컴파일 단계에서 오류를 잡아준다

 

생성자 주입

 

수정자 주입

 

자동주입시 빈이 2개 이상일때

 

@Autowired 애너테이션을 사용하면, 타입으로 빈을 검색하여 주입한다. 그런데 상속과 같이 같은 타입의 빈이 2개이상

존재하면, 어떻게 빈을 주입할까?

 

<@Qualifier 사용>

@Qualifier 빈 설정
@Qualifier 사용하기

 

- 빈을 설정할때 이름과 함께 @Qualifier 애너테이션을 사용한다. 빈을 주입할때는 파라미터에 @Qualifier("이름") 을 붙여
빈을 선택하여 주입한다.

 

<@Primay 사용> 

 

- @Primary 애너테이션은 빈 설정시에만 붙여주면 된다. @Primary 붙은 빈은 우선적으로 주입된다. 

 

<우선순위>

- @Primary 와 @Qualifier 이 중복선언된 경우 @Qualifier 애너테이션이 우선순위를 가진다.  

기본적으로 @Primary 애너테이션을 사용하고, 보조적인 빈이 필요할경우 @Qualifier 애너테이션을 사용하자

 

 

조회한 빈이 모두 필요할 때 Map, List

 

Map 과 List 에 구현체를 모두 주입할 수 있다.

 

- DiscountService는 Map으로 모든 DiscountPolicy 를 주입받는다. fixDiscountPolicy, rateDiscountPolicy 가 주입된다.
- discount () 메서드는 discountCode로 "fixDiscountPolicy"가 넘어오면 map에서
- fixDiscountPolicy 스프링 빈을 찾아서 실행한다. 물론 “rateDiscountPolicy”가 넘어오면
- rateDiscountPolicy 스프링 빈을 찾아서 실행한다.

 

 

 

 

 

이 글은 김영한님의 스프링 핵심 원리 - 기본편을 바탕으로 작성되었습니다.