스프링 컨테이너 생성
스프링 컨테이너를 생성할 때는 ApplicationContext라는 인터페이스를 이용하며, 상황에 맞는 구현 객체를 생성해주면 된다.
스프링 부트의 등장 이후 Annotation을 많이 사용하기 때문에 AnnotationConfigApplicationContext를 주로 이용한다. 인자로는 @Configuration 어노테이션이 붙은 설정 클래스 파일을 넘겨주면 된다.
ApplicationContext ac = new AnnotationConfigApplicationContext(Config.class);
스프링 컨테이너의 생성 과정
스프링 컨테이너를 생성할 때 매개 변수로 Configuration 클래스 파일을 넘겨주는데, 스프링 컨테이너는 이 클래스 파일을 참고하여 빈 이름과 객체를 맵핑한다. (스프링 컨테이너는 빈 이름, 빈 객체가 해쉬맵 처럼 묶여 있다.)
빈 이름은 메서드의 이름이 기본적으로 들어가고, 값(객체)은 return한 객체로 설정이 된다. 만약 Config.class에 다음과 같은 메소드가 선언되어 있다면 스프링 컨테이너의 모양은 다음과 같다.
빈 이름 | 빈 객체
memberService. MemberServiceImpl
memberRepository MemoryMemberRepository
@Bean
public MemberService memberService() { return new MemberServiceImpl(MemberRepository()); }
@Bean
public MemberRepository memberRepository() { return new MemoryMemberRepository()); }
Config.class파일에 있는 모든 Bean을 등록하고 나면 스프링 컨테이너는 의존관계를 설정한다.
meberService -------> MemberRepository
이는 단순히 자바 코드를 호출하는 것 같지만, 차이가 있다. 스프링 컨테이너는 빈을 생성하고 의존관계를 주입하는 단계가 나누어져 있지만, 자바 코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한 번에 처리된다.