스프링
Springs-의존관계 주입과 옵션처리
백정탈
2023. 3. 3. 20:19
의존관계 주입
의존관계 주입은 크게 4가지 방법이 있다.
1.생성자 주입 수정자
2.주입(setter 주입)
3.필드 주입
4.일반 메서드 주입
생성자 주입 수정자
생성자 호출 시점에 딱 1번만 호출됨
불변,필수 의존관계 사용
주로 많이 사용한다.
생성자가 딱 1개만 있으면 @Autowired를 생략해도 된다.
예)
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
//@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
수정자 주입(setter 주입)
setter라 불리는 필드의 값을 변경하는 수정자 메서드를 통해서 의존관계를 주입하는 방법이다.
선택, 변경 가능성이 있는 의존관계에 사용
하지만 의존관계 주입은 불변,필수여야 하는 경우가 많아 잘 쓰지 않는다.
예)
@Component
public class OrderServiceImpl implements OrderService {
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
필드 주입
필드에 바로 주입하는 방법이다.
외부에서 변경이 불가능해서 테스트 하기 힘들다.
웬만해서 쓰지 않는게 좋다. 다만 스프링 설정을 목적으로 하는 @Configuration 같은 곳에서만 특별한 용도로 사용해라
일반 메서드 주입
일반 메서드를 통해서 주입 받을 수 있다.
이것도 웬만해서 잘 사용하지 않는다.
@Autowired 옵션처리
옵션처리 해야하는 이유: 주입할 스프링 빈이 없어도 동작해야 할때가 있다. @Autowired의 기본값은 true이기 때문에 주입대상이 없으면 오류가 발생한다.
3가지 방법
1.@Autowired(required=false)
2.@Nullable
3.Optional<>
@Autowired(required=false)
자동 주입할 대상이 없으면 메서드자체가 호출이 안된다.
@Autowired(required = false)
public void setNoBean1(Member member) {
System.out.println("setNoBean1 = " + member);
}
@Nullable
자동 주입할 대상이 없으면 Null 호출
@Autowired
public void setNoBean2(@Nullable Member member) {
System.out.println("setNoBean2 = " + member);
}
Optional<>
자동 주입할 대상이 없으면 Optional.empty를 출력한다.
@Autowired(required = false)
public void setNoBean3(Optional<Member> member) {
System.out.println("setNoBean3 = " + member);
}