스프링 컨테이너 라이프 사이클
1. bean 등록
2. 연관 관계 자동 주입
MemberRepository
는 평생 변경 할 수 없는 몸이 될 수 있다. 의존 관계는 한번 일어나면 애플리케이션 종료시점까지 의존관계를 변경할 일이 없다. final
키워드를 통해서 필수로 값을 지정 할 수 있도록 설정 할 수 있다. 불변이기 때문에 @Autowired
는 자동으로 붙어서 자동으로 의존 관계가 주입되는 것을 확인 할 수 있다. // 생성자를 통해서만 의존 관계가 주입 되기 때문에 외부에서 빈 주입을 할 수 없음
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
롬복 라이브러리를 사용해서 좀 더 쉽게 제공 할 수 있다.
// final 변수를 바탕으로 생성자를 생성해주는 @RequiredArgsConstructor을 이용해서 생성자 주입 구현 가능
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
private MemberRepository memberRepository;
private DiscountPolicy discountPolicy;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
System.out.println("memberRepository = " + memberRepository);
// MemberRepository가 final로 선언 되어 있으면 당연히 setter를 통해서 값을 변경 할 수 없다;
this.memberRepository = memberRepository;
}
@Autowired
public void setDiscountPolicy(DiscountPolicy discountPolicy)
{
System.out.println("discountPolicy = " + discountPolicy);
this.discountPolicy = discountPolicy;
}
@Configuration
의 경우에는 상관 없음의존관계 자동 주입은 스프링 컨테이너가 관리하고 있는 빈이어야지만 동작한다는 걸 명심하자..!
조회되는 빈이 2개 이상인 경우?
1. @Autowired의 필드명을 특정 빈 이름으로 지정해준다.
2. @Qualifier를 이용해서 이름을 줘서 조회 해 준다.
3. @Primary를 이용해서 해당 빈들 사이의 우선 순위를 지정해준다.
보통 실무에선 어떻게 쓰나요?
메인으로 사용하는 bean에는 @Primary를 통해서 우선 순위를 주고 서브 bean의 경우에는 @Qulifier를 지정해줘서 사용함.
@Primary와 @Qulifer가 두 bean에 각각 지정되어 있다고 치면 사용하는 측에서는 @Qulifer에 지정된 bean이 좀 더 자세한 bean 지정이기 때문에 그를 따라감.
자동, 수동 빈 등록 유형