AppConfig.java
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
//return new RateDiscountPolicy();
}
OCP와 DIP를 모두 만족한다
"한 클래스는 하나의 책임만 가져야 한다."
"추상화에 의존해야지, 구체화에 의존하면 안된다." 의존성 주입은 이 원칙을 따르는 방법중 하나다.
"소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다."
제어의 역전
프레임 워크 vs 라이브러리
의존관계 주입 DI(Dependency Injection)
"정적인 클래스 의존관계"
import 코드만 보고 의존관계를 파악할 수 있다. 정적인 의존관계는 어플리케이션 실행없이 알 수 있다. 이러한 클래스 의존관계만으로는 실제 어떤 객체가 OrderServiceImpl에 주입될지 알수없다.
"동적인 객체 인스턴스 의존관계"
IoC 컨테이너, DI 컨테이너
지금까지 순수하게 자바 코드만으로 DI를 적용했다. 이제 스프링을 사용해보자.
AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
MemberApp
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderApp
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);