다양한 의존관계 주입 방법
1. 생성자 주입
2. 수정자 주입
3. 필드 주입
4. 일반 메서드주입
https://windy7271.tistory.com/149
옵션 처리
주입 할 스프링 빈이 없어도 동작해야할 때가 있다.
@Autowired 만 사용하면 required 값이 true 라 자동 주입 대상이 없으면 오류 발생
static class TestBean {
@Autowired(required = false) // 의존관계가 없을때 false 면 호출도 안됨
public void setNoBean1(Member noBean1) {
System.out.println("noBean1 = " + noBean1);
}
@Autowired // null 로 들어옴
public void setNoBean2(@Nullable Member noBean2) {
System.out.println("noBean2 = " + noBean2);
}
@Autowired // 자바 8 문법 Optional.empty 로 넣어줌
public void setNoBean3(Optional<Member> noBean3) {
System.out.println("NoBean3 = " + noBean3);
}
}
생성자 주입을 쓰는게 가장 좋다 ... 왜??
- 대부분의 의존관계는 애플리케이션 종료전까지 변하면 안된다.
- 주입 데이터를 누락 했을때 컴파일오류가 나온다 (NPE)를 피할 수 있음
- final 키워드를 넣을 수 있다.
생성자주입 >>>> 수정자주입 >필드주입
필드주입 처럼 편하게 사용 하는법 > 롬복을 적용한다.
롬복 설치 >> intellij 에서 Annotation Processors 들어가서 Enabale annotaition processing 체크를 해줘야 가능.
@Getter
@Setter
// 두개 해주면 밑에 코드를 알아서 생성해줌
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@RequiredArgsConstructor // final이 붙은걸 가지고 아래처럼 생성자를 만들어줌
// @Autowired 생략가능
// public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
// this.memberRepository = memberRepository;
// this.discountPolicy = discountPolicy;
// }
조회 대상 빈이 2개 이상일 때 해결 방법
1. @Autowired 필드명 매칭
- 타입 매칭
- 타입 매칭의 결과가 2개 이상일 때 필드 명, 파라미터 명으로 빈 이름 매칭
2. @Quilifier 끼리 매칭 > 빈 이름 매칭
Quilifier 이란 추가 구분자를 붙여주는 방법. >> 빈 이름을 변경하는 것은 아니다.
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy{
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("fixDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
- 같은 Quilifier 를 찾아서 주입해줌
- 빈 이름 매칭
- 없으면 예외발생
3. @Primary 사용
- 우선선위를 정하는 방법 @Autowired 시 여러 빈 매칭 되면 @Primary 가 우선권을 가진다.
메인 데베에서는 @Primary 서브 데베에서는 @Qualifier 를 지정해서 명시적으로 획득 하는 방식으로 사용하면 코드가 깔끔하다
Primary 는 기본 값처럼 동작 하고 Qualifuer는 상세하게 동작한다. 넓은범위<좁은범위 자동<수동
우선순위는 @Qualifier 가 우선권이 높다
조회한 빈이 모두 필요할때 List, Map
스프링을 사용하여 전략 패턴을 간단하게 구현
댓글