스프링/1. 스프링 핵심 원리

46강. 프로토타입 빈.

sdafdq 2023. 7. 24. 20:32

프로토타입 빈은 조회할 때 (getBean())마다 새로 생성해서 줌.

그냥 생성 -> 의존관계주입 -> 초기화콜백함수 까지만 해주고 관리를 안해줌. 아예 컨테이너에서 메모리 참조를 안한다? 라고 보면 될려나?

 

그래서 소멸전 콜백 함수 같은 건 클라이언트가 직접 호출해야 함.

 

 

 

 

 

 

 

public class SingletonTest {
    @Test
    @DisplayName("싱글톤 빈 테스트")
    void singletonBeanFind(){
        AnnotationConfigApplicationContext ac =
                new AnnotationConfigApplicationContext(SingletonBean.class);

        SingletonBean singletonBean1 = ac.getBean(SingletonBean.class);
        SingletonBean singletonBean2 = ac.getBean(SingletonBean.class);

        assertThat(singletonBean1).isSameAs(singletonBean2);

        ac.close();
    }

    @Scope("singleton")
    static class SingletonBean{
        @PostConstruct
        public void init(){
            System.out.println("SingletonBean.init");
        }

        @PreDestroy
        public void destroy(){
            System.out.println("SingletonBean.destroy");
        }
    }
}

close() 쓰기 위해 AnnotationConfigApplicationContext로 받았고, 

같은지 검사.

 

@Scope("singleton") 은 사실 기본값이라 쓸 필요는 없음.

그리고 @Bean으로 안 써도 AnnotationConfigApplicationContext(SingletonBean.class); 이렇게 해 주면 알아서 컴포넌트 스캔 해줌.

 

그리고 초기화 함수, 소멸전 함수 모두 실행.

 

 

 

 

public class PrototypeTest {
    @Test
    @DisplayName("프로토타입 빈 테스트")
    void prototypeBeanFind(){
        AnnotationConfigApplicationContext ac =
                new AnnotationConfigApplicationContext(PrototypeBean.class);

        PrototypeBean prototypeBean1 = ac.getBean(PrototypeBean.class);
        PrototypeBean prototypeBean2 = ac.getBean(PrototypeBean.class);

        assertThat(prototypeBean1).isNotSameAs(prototypeBean2);

        ac.close();
    }

    @Scope("prototype")
    static class PrototypeBean{
        @PostConstruct
        public void init(){
            System.out.println("PrototypeBean.init");
        }

        @PreDestroy
        public void destroy(){
            System.out.println("PrototypeBean.destroy");
        }
    }
}

소멸전 함수 실행 안됨.