스프링 변환 관련 애노테이션
- @Configuration: 애플리케이션의 구성정보를 담당하는 파일이라고 명시
- @Bean: 명시된 멤버들이 스프링 컨테이너에 등록된다.
@Configuration
public class AppConfig {
@Bean
private MemoryMemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new FixDiscountPolicy();
}
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
}
스프링 컨테이너
ApplicationContext를 스프링 컨테이너라고 한다.
기존에는 개발자가 AppConfig를 사용해서 직접 객체를 생성하고 DI를 했지만,
이제부터는 스프링 컨테이너를 통해서 사용한다.
스프링 컨테이너는 @Configuration이 붙은 AppConfg를 설정(구성)정보로 사용한다.
여기서 @Bean이라고 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
스프링 빈은 @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다
이전에는 개발자가 필요한 객체를 AppConfig를 사용해 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야한다. 스프링 빈은 applicationContext.getBean() 메서드를 사용해서 찾을 수 있다.
기존에는 개발자가 직접 자바코드로 모든것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
// AppConfig를 스프링의 Config 파일로 지정 및 생성된 객체를 관리
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
// Config에서 memberService(메소드이름)을 꺼내오겠다 , 반환 타입
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("find Member = " + findMember.getName());
//실행시 아래와 같이 @Bean을 인스턴스로 생성해준다.
// 02:55:00.299 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig'
// 02:55:00.303 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'memberRepository'
// 02:55:00.315 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'discountPolicy'
// 02:55:00.321 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'memberService'
// 02:55:00.322 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderService'
}
'SpringFramework > Spring 중요 개념' 카테고리의 다른 글
[Spring] 싱글톤 컨테이너 (0) | 2021.12.17 |
---|---|
[Spring] 스프링 컨테이너 (0) | 2021.12.16 |
[Spring] IOC, DI, 그리고 컨테이너 (0) | 2021.12.15 |
[Spring] 객체지향원리 개념 (DI) (0) | 2021.12.15 |
[Spring] 예제 만들기 (순수 Java) (0) | 2021.12.13 |
댓글