작성
·
209
3
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
AnnotationConfigApplicationContext ac2 = new AnnotationConfigApplicationContext(AutoAppConfig2.class);
MemberService memberService = ac.getBean(MemberService.class);
MemberService memberService2 = ac2.getBean(MemberService.class);
assertThat(memberService).isSameAs(memberService2);
위와같이 하면 같지않다고 테스트코드에서 에러를 발생시키는데 이유를 알고싶습니다..
밑에 Stack Trace??를 확인해보니까
Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7a419da4
Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@704f1591
이것의 참조값이 다른것으로 보이는데 혹시 위에서 new AnnotationConfigApplicationContext를 두번 new 해서 다른 참조값을 가졌고, 그로인해서 isSameAs가 테스트실패를 발생시키는 건가요??아니면 @Configuration이 붙은 Config class가 두개라서 각각 다른 컨테이너 영역?? 같은것이 있는건가요??
제 머릿속에는 그 스프링 빈 저장소 표가 그려지는데 @Configuration이 붙은 다른 클래스이긴 해도 스프링 컨테이너는 한개일 것같은데.. 빈이름이 같은게 두개가 들어가지는 않을꺼고.. 이런경우는 표(빈 저장소)가 두개가 생기는건가 싶기도하고 혼란이옵니다 ㅠㅠ
아참 그리고 두개의 빈을
AutoAppConfig bean = ac.getBean(AutoAppConfig.class);
System.out.println("bean = " + bean.getClass());
AutoAppConfig2 bean2 = ac2.getBean(AutoAppConfig2.class);
System.out.println("bean = " + bean2.getClass());
위의 코드로 결과를 보니 아래와같은 결과가 나왔습니다
bean = class hello.core.AutoAppConfig$$EnhancerBySpringCGLIB$$6c114215
bean = class hello.core.AutoAppConfig2$$EnhancerBySpringCGLIB$$e5b62b57
이것으로 인하여 결과가 다른건가요??!
답변 1
2
안녕하세요. YMMD님, 공식 서포터즈 OMG입니다.
ApplicationContext인터페이스 그자체가 스프링컨테이너인데요, ApplicationContext인터페이스를 구현한 AnnotationConfigApplicationContext클래스 가 현재 코드에서 스프링컨테이너의 역할을 하고 있습니다.
스프링컨테이너 ac 와 ac2 2개를 생성하였으므로 서로다른 컨테이너가 생성된 것으로 보시면 되며, 그로 인해 동일한 타입의 빈이지만 서로 다른 참조값을 가지고 있는 것입니다.
이런경우는 표(빈 저장소)가 두개가 생기는건가 싶기도하고 혼란이옵니다 ㅠㅠ
=> 이 내용이 맞습니다.
감사합니다.
동일한 질문은 아니지만 관련이 있기 때문에 참고하시면 도움이 되실 수 도 있을 것 같아 링크 첨부합니다.
AppConfig가 스프링 컨테이너인 거죠? - 인프런 | 질문 & 답변 (inflearn.com)