Development Study/Spring Framework
[Spring] @Configuration, @Bean
paranjong
2022. 9. 25. 15:50
스프링 컨테이너
//스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- ApplicationContext를 스프링 컨테이너라 한다.
- ApplicationContext는 인터페이스이다.
- 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설저 클래스로 만들 수 있다.
- 어노테이션 기반의 자바 설정 클래스로 스프링 컨테이너를 만든 예시는 아래와 같다.
//자바 설정 클래스 기반 스프링 컨테이너
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- AnnotationConfigApplicationContext 클래스는 ApplicationContext 인터페이스의 구현체이다.
- 스프링 컨테이너 생성


- 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다
- 스프링 컨테이너는 설정 정보를 참조하여 의존관계를 주입(DI)한다.
- 참고
- 스프링 빈을 생성하고, 의존관계를 주입하는 단계가 나뉘어짐.
- 자바코드로 스프링 빈을 등록하면 생성자를 호출하면서 의존관계 주입도 한번에 처리됨.
빈 이름
- 빈 이름은 메서드 이름을 사용한다.
- 빈 이름을 직접 부여할 수도 있다.
- @Bean(name="memberService2")
- 빈이름은 항상 다른 이름을 부여해야함.!!
AppConfig 스프링 기반으로 변경
@Configuration //설정을 구성
public class AppConfig {
@Bean // 스프링 컨테이너에 스프링 빈 등록
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(
memberRepository(),
discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
- 스프링 컨테이너는 @Configurattion이 붙은 AppConfig를 설정(구성) 정보로 사용한다.
- @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
- 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
- 스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.
MemberApp 스프링 기반으로 변경
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
스프링 컨테이너를 통해서 필요한 스프링 빈을 찾아야 한다. 스프링 빈은 ApplcationContext.getBean()메서드를 사용해서 찾을 수 있다.