@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들이 싱글톤? 객체니까 레퍼런스로? 하나씩 다 컨테이너에 등록될 듯.
public class MemberApp {
public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService",MemberService.class);
Member member1 = new Member(1L, "kim", Grade.BASIC);
memberService.join(member1);
Member findMember = memberService.findMember(1L);
System.out.println("findMember = " + findMember.getName());
System.out.println("member1 = " + member1.getName());
}
}
ApplicationContext 이게 컨테이너라고 보면 됨.
모든 Bean 관리
Annotation 주석기반으로 ConfigApp 한 컨테이너
AppConfig.class 이 클래스를 바탕으로 하라고
getBean("이름", 반환타입)
"이름"은 보통 메소드 이름. 메소드 이름을 빈 이름으로 사용
@Bean(name = "이름") 이렇게 변경도 가능하긴 함.. 근데 굳이..
참고로 .class는 인스턴스가 아니라 타입 자체를(이게 어떤 타입이다, 타입에 대한 정보인 듯?) 넘길 때 저렇게 하는 듯.
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
20강. 빈 확인 (0) | 2023.07.17 |
---|---|
19강. 스프링 컨테이너 생성 (0) | 2023.07.16 |
17강. IoC, DI, 컨테이너 (0) | 2023.07.16 |
16강. Rate할인으로 변경 (0) | 2023.07.16 |
15강. AppConfig 리팩토링 (0) | 2023.07.16 |