@Configuration 어노테이션이 붙은 클래스는 설정 정보를 담당하는 클래스가 된다.
클래스의 메서드에 @Bean 어노테이션을 붙여 스프링 빈으로 등록할 수 있다.
// AppConfig Class
@Configuration
public class AppConfig {
@Bean
public MemberService memberService(){
System.out.println("Call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository(){
System.out.println("Call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService(){
System.out.println("Call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
}
public class ConfigurationSingletonTest {
@Test
void ConfigurationDeep(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
AppConfig bean = ac.getBean(AppConfig.class);
System.out.println("bean = " + bean.getClass());
}
}
// test 코드 결과
Call AppConfig.memberService
Call AppConfig.memberRepository
Call AppConfig.orderService
bean = class hello.core.AppConfig$$SpringCGLIB$$0
class hello.core.AppConfig$$SpringCGLIB$$0 ??class hello.core.AppConfig 라고 나오지 않는 이유는 다음과 같다.@Bean이 붙은 메서드마다 이미 스프링 빈이 존재하면 존재하는 빈을 반환하고, 스프링 빈이 없으면 생성해서 스프링 빈으로 등록하고 반환하는 코드가 동적으로 만들어지게 됨만약, @Configuration 가 없다면 ?
Call AppConfig.memberService
Call AppConfig.memberRepository
Call AppConfig.memberRepository
Call AppConfig.orderService
Call AppConfig.memberRepository
bean = class hello.core.AppConfig
class hello.core.AppConfig → 내가 만든 클래스