ac.getBean("");은 약간 request.getParameter와 같은 구조라고 이해해도 될까..?
이때까지 자바만을 이용해서 구현 객체는 자신의 로직만을 실행하고 프로그램의 제어 흐름은 AppConfig가 하도록 프로그램을 작성하였다. 그리고 이렇게 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 제어의 역전(Inversion of Control) 이라 한다.
이렇게 자바로 구성한 AppConfig를 스프링으로 변환하면 어떻게 될까?
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();
}
}
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
orderService = appConfig.orderService();
}
@Configuration : 해당 클래스가 설정정보임을 스프링 컨테이너에게 알려준다.
@Bean : @Bean이 붙은 메서드들의 호출 후 반환된 객체를 스프링 컨테이너에 등록한다. 등록된 객체를 스프링 빈이라고 한다.
@Bean이 붙은 메서드의 이름으로 getBean(메서드이름)
와 같이 해당 메서드를 호출할 수 있다.
앞으로는 AppConfig객체를 생성하고 그 안의 메서드를 호출하는 것이 아니라 스프링 컨테이너를 호출하고 그 안에 등록된 스프링 빈들을 사용할 수 있다.
사용하는 방법은 예시(2)와 같이
applicationContext.getBean((스프링빈이름), (스프링빈타입));
로 호출할 수 있다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
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);
// applicationContext.getBean("memberService", MemberService.class);의 값은 MemberServiceImpl이다.
}
}