@Component,@ComponentScan,@Configuration,@Bean, ApplicationContext
⇒ 다형성 + OCP(개방-폐쇄 원칙), DIP(의존 역전 원칙) 가능
ex) JAVA
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
DIP
다형성을 위해 기능(Interface)과 구현(class)을 분리하였지만 Client는 기능과 구현 둘 다에 의존
OCP
기능을 확장하여 변경 시 client 코드에 영향을 줌
⇒ for DIP+OCP
기능 영역과 사용 영역 분리 == client는 직접적 객체를 선택하지 X + 구성 영역에서 Client가 사용하는 객체 구성

SO, Spring
public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy();
}
}
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;
}
}
⇒ 코드의 변경에는 닫혀있고, 확장에는 열려있다
⇒ Client는, 구현체는 전혀 의존 하지 않고(어떤 객체를 선택하는지 모름) / 기능에만 의존한다.
: Spring IoC 컨테이너가 관리하는 자바 객체
⇒ not new 연산자
ApplicationContext.getBean()으로 얻어질 수 있는 객체