@Test
void configurationDeep(){
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
AppConfig bean = ac.getBean(AppConfig.class);
System.out.println("bean = " + bean);
//bean = hello.core.AppConfig$$EnhancerBySpringCGLIB$$79b7202a@5170bcf4
}
@Configration이 붙은 appConfig 빈을 출력해보면 xxxCGLIB이라는 객체가 출력되는 것을 볼 수 있다.
스프링이 바이트코드 조작 라이브러리를 사용해서 AppConfig 클래스를 상속받은 클래스를 만들고 그 클래스를 스프링 빈으로 등록한다.
AppConfig@CGLIB 예상 동작
@Bean
publci MemberRepository memberRepository(){
if(이미 스프링 컨테이너에 등록이 되어있으면){
return 스프링 컨테이너에서 찾아서 반환;
}else{
기존 로직을 호출하고 객체를 생성해 스프링 컨테이너에 등록
return 객체 반환;
}
즉, Configuration이 바이트코드를 조작하는 CGLIB 기술을 사용해 싱글톤을 보장하는 것이다.