프로토타입 빈은 조회할 때 (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");
}
}
}
소멸전 함수 실행 안됨.
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
48강. Provider (0) | 2023.07.24 |
---|---|
47강. 프로토타입빈을 싱글톤 빈과 사용할 때 문제 (0) | 2023.07.24 |
45강. 빈 스코프 (0) | 2023.07.23 |
44강. @PostConstruct, @PreDestroy 로 콜백 (0) | 2023.07.23 |
43강. 빈 등록시 설정 정보에 초기화, 소멸 메서드 지정 (0) | 2023.07.23 |