요즘은 xml로 DI를 주입하는게 아니라 annotation 기반의 자바 클래스를 만들 수 있음.
현재 어노테이션으로 의존성 주입한 config 클래스이다.
@Configuration
public class AppConfig
{
private static AppConfig appConfig;
public static AppConfig getInstance(){
if(appConfig == null){
appConfig = new AppConfig();
}
return 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();
}
}
test 폴더로 가서 ApplicationContextInfoTest.java를 생성한다.
DisplayName은 JUnit5만 지원 가능하다.
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력하기")
void findAllBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = "+ beanDefinitionName + "object = " + bean);
}
}
}
// 출력
name = appConfigobject = hello.core.AppConfig$$EnhancerBySpringCGLIB$$37c23c80@2a5b3fee
name = memberServiceobject = hello.core.member.MemberServiceImpl@7c1e2a2d
name = memberRepositoryobject = hello.core.member.MemoryMemberRepository@333dd51e
name = orderServiceobject = hello.core.order.OrderServiceImpl@52d645b1
name = discountPolicyobject = hello.core.order.RateDiscountPolicy@2101b44a
현재 주입하고 있는 클래스들을 볼 수 있다.
하지만 위에 내가 주입한 것이 아닌 스프링 컨테이너에서 주입한 클래스들이 뜨게 된다.
@Test
@DisplayName("어플리케이션 빈 출력하기")
void findApplicationAllBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = "+ beanDefinitionName + "object = " + bean);
}
}
}