@Component, @ComponentScan, @Configuration, @Bean, ApplicationContext

WHY?

⇒ 다형성 + OCP(개방-폐쇄 원칙), DIP(의존 역전 원칙) 가능

ex) JAVA

public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
 private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}

⇒ for DIP+OCP

기능 영역과 사용 영역 분리 == client는 직접적 객체를 선택하지 X + 구성 영역에서 Client가 사용하는 객체 구성

Untitled

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()으로 얻어질 수 있는 객체