생성자 주입
- 생성자를 활용하여 의존관계를 주입
- 빈 등록과 동시에 의존관계 주입이 발생함 (의존관계 주입을 생성자로 하는데, 빈 등록을 위해 객체 생성을 하려면 생성자를 바로 호출하니깐...)
- 딱 1번만 발생
- final 키워드 사용 가능 (생성자로 바로 초기화가 가능하니깐...)
=> 불변, 필수
- 생성자가 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 메서드는 나중에도 호출이 가능
- final 키워드 사용 불가
=> 변경, 선택
@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;
}
/*
비즈니스 로직
*/
}
필드 주입
- 그냥 필드에 @AutoWired만 써서 바로 주입
- 코드가 간결하지만, 외부에서 변경이 불가능해서 테스트가 어려움
- 스프링 프레임워크가 없으면 기능 X
- 그냥 Java코드로 테스트 어려움
@Component
public class OrderServiceImpl implements OrderService{
@AutoWired
private MemberRepository memberRepository;
@AutoWired
private DiscountPolicy discountPolicy;
/*
비즈니스 로직
*/
}
일반 메서드 주입
- 사용 X
@Component
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void init(MemberRepository memberRepository, DiscountPolicy discountPolicy){
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
/*
비즈니스 로직
*/
}
어떤 주입 방법을 사용?
=> 생성자 주입 사용
- 생성자 주입은 불변, 필수의 특징이 있음
- 불변 : 의존관계는 한번 주입이 일어나면 애플리케이션 종료까지 변경될 일도 없고, 변경되면 안 됨, 생성자 주입은 생성자 호출 시 단 1회만 발생
- 필수 : 객체 생성 시 생성자 호출이 필수적
- final 키워드는 생성자 주입에서만 사용이 가능 => 값이 초기화되지 않는 경우 IDE에서 컴파일 오류로 알려줌
- 테스트 시에 생성자 파라미터를 누락한 경우 IDE에서 컴파일 오류로 알려줌
- 그냥 Java로 테스트 가능
- 수정자 주입이나 일반 메서드 주입은 메서드를 public으로 두기 때문에 누가 나중에 변경할 수 도 있음 => 불변 X
'WEB > spring' 카테고리의 다른 글
[Spring] 자동 빈 등록(@Component) vs 수동 빈 등록(@Bean) (0) | 2021.04.18 |
---|---|
[Spring] @AutoWired 조회 빈 2개 이상, @Qualifier, @Primary (0) | 2021.04.18 |
[Spring] 컴포넌트 스캔, @ComponentScan, @AutoWired (0) | 2021.04.16 |
[Spring] 싱글톤 패턴, 싱글톤 컨테이너, CGLIB (0) | 2021.04.15 |
[Spring] 스프링 컨테이너, BeanFactory , ApplicationContext, BeanDefinition (0) | 2021.04.15 |