인프런 김영한 강사님의 강의를 듣고 개인적으로 정리 하기 위해서 작성한 글 입니다!📖
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
OrderServiceImpl 클래스에 @Autowired 어노테이션을 필드 객체에 직접 선언하였다.
@Component
public class OrderServiceImpl implements OrderService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private DiscountPolicy discountPolicy;
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
,,, 생략 ,,,
}
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
롬복 어노테이션인 RequiredArgsConstructor 어노테이션을 클래스 위에 선언을 해준다.
필드에 선언된 객체에 final 을 명시한다.
위의 방법으로 코드를 작성하게 되면 컴파일 후에 아래 코드 예시 처럼 롬복에서 final이 붙은 필드는 생성자 주입이 되도록 컴파일 해준다.
-> 생성자 주입과 동일한 코드가 된다!
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
,,, 생략 ,,,
}