public class AppConfig {
public MemberService memberService() {
return new MemberServiceImpl(getMemberRepository());
}
private static MemoryMemberRepository getMemberRepository() {
return new MemoryMemberRepository();
}
public OrderService orderService() {
return new OrderServiceImpl(getMemberRepository(), discountPolicy());
}
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
// return new FixDiscountPolicy();
}
}
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(getMemberRepository());
}
@Bean
public static MemoryMemberRepository getMemberRepository() {
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(getMemberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
// return new FixDiscountPolicy();
}
}
이렇게 하면 @Bean을 추가한 메서드들이 Spring Container에 다 등록이 된다.
참고로 @Bean
에 속성값을 이용하여 따로 이름을 부여할 수 있다.
@Bean(name="mnm")
public MemberService memberservice(){
...
public class MemberApp {
public static void main(String[] args) {
AppConfig appConfig = new AppConfig();
MemberService memberService = appConfig.memberService();
// MemberService memberService = new MemberServiceImpl();
Member member = new Member(1L, "memberA", Grade.VIP);
memberService.join(member);
Member finMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find member = " + finMember.getName());
}
}
public class MemberApp {
public static void main(String[] args) {
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 finMember = memberService.findMember(1L);
System.out.println("new member = " + member.getName());
System.out.println("find member = " + finMember.getName());
}
}
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
이렇게 하면 AppConfig.java 파일에 있는 환경설정정보 (annotation)들을 spring container에 다 집어넣어서 관리해준다.
참고로 applicationContext라는 변수명이 너무 길어서 ac
라고도 많이 쓰기도 한다.
이렇게 하면 이제는 직접 참조하는 것이 아닌, 스프링 컨테이너를 통해서 가져와야한다.
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
getBean()
메서드는 첫째로는 키값인 이름을, 둘째는 해당 값을 타입을 지정해주면 된다.
- AppConfig를 annotaion을 이용하여 Spring Container에 등록하여 사용한다.
- 스프링 container는
@Connfiguration
이 붙은AppConfig
를 설정(구성)정보로 사용한다. 이때@Bean
이라 적힌 메서드를 모두 호출해서 반환된객체
를 스프링 컨테이너에 등록한다.
이렇게 spring container에 등록된 객체를 "스프링 빈"이라 한다.- 스프링 빈은 메서드 명을 빈의 이름으로 사용한다.
- spring container를 통해서 필요한 빈(객체)를 찾아야한다.