public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// MemberService memberService = new MemberServiceImpl();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); //스프링 컨테이너에 Bean 등록
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member findMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("found member = " + findMember.getName());
}
}
@Configuration //설정정보
public class AppConfig {
@Bean //스프링 컨테이너에 등록ㄴ
//애플리케이션의 실제 동작에 필요한 구현 객체를 생성
//생성한 객체 인스턴스의 참조(레퍼런스)를 생성자를 통해서 주입(연결)
//메서드 이름만으로도 역할과 전체구성을 알 수 있도록 리팩토링(중복제거, 이후 구현체 변경시에도 변경코드 축소)
public MemberService memberService() {
return new MemberServiceImpl(memberRepository()); //생성자 주입
}
@Bean
private static MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy();
return new RateDiscountPolicy(); //변경시 구성 영역만 변경하면 OK (사용영역에 변경 영향 x)
}
}
- ApplicationContext: 스프링 컨테이너
- 기존에는 AppConfig에서 직접 객체를 생성하고 DI를 했지만, 스프링 컨테이너를 통해 사용
- 스프링 컨테이너는 @Configuration이 붙은 AppConfig 설정정보 사용
- @Bean이 붙은 메서드를 모두 호출해서 스프링 컨테이너에 등록
- 이렇게 등록된 객체: 스프링 빈