스프링 컨테이너의 생성
1
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- 스프링 컨테이너 생성
스프링 컨테이너를 생성할 떄는 구성 정보를 지정해주어야 한다. (AppConfig.class)
- 스프링 빈 등록
메서드 이름이 빈 이름이 되고, return값을 빈 객체로 등록하게 된다.
** 빈 이름을 따로 설정할 수 있다. 단, 빈 이름은 중복이 되면 안된다.
- 스프링 빈 의존관계 설정 - 준비
스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.
단순히 자바 코드를 호출하는 것 같지만 차이가 있다. 이 차이는 뒤에서 설명한다.
빈(Bean) 조회하기
테스트코드를 작성하여 등록된 빈 모두를 볼 수 있다.
AppConfig도 빈에 등록되는 것을 볼 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ac.getBean("memberService", MemberService.class); // 이름으로
ac.getBean("memberService", MemberServiceImpl.class); //구체로
ac.getBean(MemberService.class); // 이름없이 타입으로
@Bean
memberService1() { return MemberService;}
@Bean
memberService2() { return MemberService;}
//이러한 클래스가 있다면 이름없이 타입으로 조회했을 때 중복오류 발생
//이런 경우 이름으로 getBean 해주어야 한다.
Map<String, MemberRepository> beans = ac.getBeansOfType(MemberService);
//key, value를 이용해 모두 가져올 수도 있다.
*빈 조회 - 상속관계
- 부모타입으로 조회하면, 자식 타입도 함께 조회한다.
- 그래서 모든 자바 객체의 최고 부모인 ‘Object’ 타입으로 조회하면 모든 스프링 빈을 조회한다.
1
2
3
4
5
6
7
8
9
10
11
@Bean
public DiscountPolicy rateDiscountPolicy(){
return new rateDiscountPolicy();
}
@Bean
public DiscountPolicy fixDiscountPolicy(){
return new fixDiscountPolicy();
}
//이렇게 존재할 때, ac.getBean(DiscountPolicy.class); 하면 중복 발생한다.
BeanFactory와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스
- 스프링 빈을 관리하고 조회하는 역할
- getBean() 제공
ApplicationContext
- 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까?
- 애플리케이션을 개발할 때는 빈은 관리하고 조회하는 기능은 물론이고, 수 많은 부가 기능이 필요하다.
- 메시지 소스를 활용한 국제화 기능 ( 한국 - 한국어, 영어권 - 영어)
- 환경 변수 - 로컬, 개발, 운영등을 구분해서 처리
- 애플리케이션 이벤트 - 이벤트를 발행하고 구독하는 모델을 편리하게 지원
- 편리한 리소스 조회 - 파일, 클래스패스, 외부 등에서 리소스를 편하게 조회
** ApplicationContext를 스프링 컨테이너라 한다.
다양한 설정 형식 지원 - 자바코드, XML
스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어 있다.
애노테이션 기반 자바코드 설정 사용이 여지껏 해왔던 방법.
XML 설정 사용
최근에는 스프링부트를 많이 사용하면서 XML 기반의 설정은 잘 사용하지 않는다. 하지만 아직 많은 레거시 프로젝트들이 XML로 되어 있고, 또 XML을 사용하면 컴파일 없이 빈 설정 정보를 변경할 수 있는 장점도 있으므로 한번쯤 배워두는 것도 좋다.
-> appConfig.xml
1
2
ApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
//이 코드를 사용해 사용한다.
스프링 빈 설정 메타정보 - BeanDefinition
스프링은 어떻게 이런 다양한 설정 형식을 지원하는 것일까?
그 중심에는 ‘BeanDefinition’ 이라는 추상화가 있다.
역할과 구현을 개념적으로 나눈 것이다.
- XML을 읽어서 BeanDefinitinon을 만든다.
- 자바 코드를 읽어서 BeanDefinition을 만든다.
스프링 컨테이너는 자바 코드인지, XML인지 몰라도 된다. 오직 BeanDefinition만 알면 된다.
BeanDefinition을 빈 설정 메타정보라 한다.
@Bean, Bean 태그 당 각각 하나씩 메타정보가 생성된다.
스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
BeanDefinition을 직접 정의하거나 사용할 일은 거의 없다.
그저 스프링이 다양한 형태의 설정 정보를 BeanDefinition으로 추상화해서 사용하는 것 정도만 이해하면 된다.