스프링 컨테이너는 싱글톤 레지스트리이다. 따라서 스프링 빈이 싱글톤이 될 수 있도록 보장해야 한다. 스프링은 클래스의 바이트 코드를 조작하는 라이브러리를 사용하기 때문에 한 번의 호출로 끝이 날 수 있는 것이다.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$d7558075
클래스 명 뒤에 EnhancerBySpringCGLIB이 붙어 있는데, 스프링이 CGLIB라는 바이트 코드 조작 라이브러리를 이용해 AppConfig 클래스를 상속받은 임의의 다른 클래스를 생성해서 그 다른 클래스를 스프링 빈으로 등록한 것이다.
bean = class hello.core.AppConfig
바이트 코드에서 조작되어 생성된 자식 클래스가 아닌 순수한 AppConfig 클래스가 출력되었다. 또한, memberRepository의 출력문이 3번 호출되었다. 이와 같은 결과를 보면 싱글톤 패턴이 깨졌다는 것을 알 수 있다.