싱글톤과 @Configuration

Mina Park·2023년 10월 9일

1. 스프링빈의 싱글톤 보장

스프링 컨테이너는 싱글톤 레지스트리이므로, 스프링빈의 싱글톤을 보장해야 함

  • 자바 코드에서 여러번 호출될 경우, 자체 라이브러리를 사용하여 싱글톤을 유지
@Test
void configurationDeep() {
ApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
//AppConfig도 스프링 빈으로 등록된다.
AppConfig bean = ac.getBean(AppConfig.class);
System.out.println("bean = " + bean.getClass());
//출력: bean = class hello.core.AppConfig$$EnhancerBySpringCGLIB$$bd479d70
}
  • 출력된 클래스 정보에 'CGLIB' 가 추가되어 있음

2. 동작원리

  • @Configuration 어노테이션이 붙어있으면, 'CGLIB'라는 바이트코드 조작 라이브러리를 사용하여 해당 클래스를 상속받은 임의의 클래스를 만든 후, 그 임의의 클래스를 스프링 빈으로 등록한 것
  • 그리고 이 임의의 클래스에서는 이미 스프링빈이 존재하면 존재하는 빈을 반환하고, 스프링빈이 없는 경우에만 새로 생성해서 스프링빈으로 등록 후 반환하는 프로세스를 거침 -> 싱글톤 보장

만약 @Configuration 이 아닌 @Bean만 적용한다면?

  • 스프링빈으로 등록은 되지만 싱글톤 보장이 되지 않고, 호출시마다 새로운 인스턴스를 생성하게 됨

0개의 댓글