Spring Containter 설정

Mina Park·2022년 8월 15일
0
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이 붙은 메서드를 모두 호출해서 스프링 컨테이너에 등록
    • 이렇게 등록된 객체: 스프링 빈

0개의 댓글