스프링 컨테이너 생성 스프링 컨테이너가 생성되는 과정을 알아보자.
//스프링 컨테이너 생성
ApplicationContext applicationContext =
new
AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext 를 스프링 컨테이너라 한다. ApplicationContext 는 인터페이스이다.
스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로 만들 수 있다. 직전에 AppConfig 를 사용했던 방식이 애노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 것이다.
자바 설정 클래스를 기반으로 스프링 컨테이너( ApplicationContext )를 만들어보자.
new AnnotationConfigApplicationContext(AppConfig.class);
이 클래스는 ApplicationContext 인터페이스의 구현체이다. > 참고: 더 정확히는 스프링 컨테이너를 부를 때 BeanFactory , ApplicationContext 로 구분해서 이야기한다.
BeanFactory 를 직접 사용하는 경우는 거의 없으므로 일반적으로 ApplicationContext 를 스프링 컨테이너라 한다.
스프링 컨테이너 생성 과정
1. 스프링 컨테이너로 전환
1) AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
2) OrderApp
public class OrderApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// OrderService orderService = appConfig.orderService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
OrderService orderService = applicationContext.getBean("orderService", OrderService.class);
...
}
설명
- new ApplicationContext(AppConfig.class)
- ApplicationContext을 스프링 컨테이너라고 한다.
- 기존에는 DI컨테이너를 사용해 직접 객체를 생성하고 DI를 했지만 이제는 스프링 컨테이너를 사용
- 스프링 컨테이너는 @Configuation이 붙은 클래스를 설정 정보로 사용
- @Bean이 적힌 메서드를 모두 호출해 반환된 객체를 스프링 컨테이너에 등록한다.
- 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
- 스프링 빈은 applicationContext.getBean(”이름”, <타입>)을 이용해 찾을수있다.
- 기존에는 주석부분 처럼 DI 컨테이너를 사용해 직접 조회했지만 이제는 스프링 컨테이너를 통해서 스프링빈 조회한다.
2. 스프링 컨테이너 생성 과정
1. 스프링 컨테이너 생성
new AnnotationConfigApplicationContext(AppConfig.class)
- 스프링 컨테이너 생성시 설정 클래스 지정해야한다. (AppConfig.class)
2. 스프링 빈 등록
설정 클래스 AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈 등록
- @Bean이 스프링 빈
- 빈 이름은 메서드 이름으로 한다.
- @Bean(name="") 으로 빈 이름 지정 가능하다.
3. 스프링 빈 의존관계 주입
- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 참고해 의존관계를 주입한다.
- 생성자를 호출하면서 의존관계 주입이 한번에 된다.
'스프링 SPRING > [SPRING] 스프링 핵심원리' 카테고리의 다른 글
[SPRING 기본] 스프링 공부 시작 전 자바의 확실한 이해는 필수... (0) | 2023.02.03 |
---|---|
[SPRING] 스프링 컨테이너에 등록된 빈을 조회해보자! | Bean 조회 및 출력하기 (0) | 2023.01.25 |
[Spring] 스프링 컨테이너 ApplicationContext (0) | 2023.01.25 |
[Spring] IoC, DI, 그리고 컨테이너 제어의 역전 IoC(Inversion of Control) (0) | 2023.01.25 |
[SPRING] 스프링 핵심원리 | 객체지향과 스프링 (0) | 2023.01.25 |