@Configuration
은 애플리케이션의 설정 정보를 담고 있다.@Bean
을 붙여준다.// AppConfig
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
return new MemberServiceImp(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
return new OrderServiceImp(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscountPolicy();
}
}
public class MemberApp {
public static void main(String[] args) {
// AppConfig appConfig = new AppConfig();
// MemberService memberService = appConfig.memberService();
/* Spring 생성 */
/*
* 1. Spring의 시작은 모두 ApplicationContext에서 시작된다.
* 2. Spring의 컨테이너라고 보면 된다.
* 3. 파라미터로 AppConfig.class를 넘겨주면 되는데 이는 AppConfig에 있는 환경 설정 정보를 가진다.
* 4. Spring이 안에 있는 요소들을 Spring 컨테이너에 집어넣어 관리해준다.
*/
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
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());
}
}
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);
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(memberId, "itemA", 20000);
System.out.println("order = "+ order);
System.out.println("order.calculator = "+ order.calculatorPrice());
}
}
아래와 같은 결과가 나오는 것을 확인할 수 있어요~!
@ApplicationContext
를 스프링 컨테이너라 한다.AppConfig
를 직접 객체를 생성하고 DI를 했다.AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
OrderService orderService = appConfig.orderService();
- 스프링 컨테이너는
@Configuration
이 붙은AppConfig
를 설정(구성) 정보로 사용한다.
- 여기서
@Bean
이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.
- 스프링 빈은
@Bean
이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다. (memberService
,orderService
)- Spring에 @Bean이 붙은 메서드들이 key는 메서드 이름, value는 반환된 객체 들어간 상태로 Spring 컨테이너에 등록이 된다.
- 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
아래와 같이 이름을 따로 설정할 수도 있다.
@Bean(name = "mmm")
키 값에 해당되는 이름을 별도로 설정해서 할 수 있지만, 관례는 메서드 명이 키 이름이 되는 것!
이전에는 개발자가 필요한 객체를
AppConfig
를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다.
- 스프링 빈은
applicationContext.getBean()
메서드를 사용해서 찾을 수 있다.- 기존에는 개발자가 직접 자바 코드에서 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.