1. 빈 스코프란 ?
- 스코프 : 빈이 존재할 수 있는 범위
- 싱글톤 스코프 : 기본 스코프, 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프
- 프로토타입 스코프 : 스프링컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고 더는 관리하지 않음(초기화메서드까지만 함, 종료메서드가 호출이 안됨)
- 웹 관련 스코프
: request : 요청이 들어오고 나갈 때까지 유지되는 스코프
: session : 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프
: application : 웹 서블릿 컨텍스트와 같은 범위로 유지되는 스코프
2. 빈스코프의 등록
- @Scope("prototype") 이렇게 하면됨
- 프로토타입 스코프를 스프링컨테이너에 조회하면 스프링컨테이너는 항상 새로운 인스턴스를 생성해서 반환한다.
- 프로토타입인 경우 반환하고 관리안함.
- 프로토타입 스코프의 빈의 경우 @PreDestroy 가 호출이 되지 않는다.
- instance 가 다르다
- init만 호출되고 destroy는 호출되지 않는다.
3. 프로토타입과 싱글톤을 함께 사용 시 문제점
- 프로토타입빈과 싱글톤빈과 함께 사용 시 의도대로 동작하지 않음
- 처음에 의존관계 주입 때 싱글톤 빈에 주입받은 프로토타입빈은 그대로 끝나는거다. 스프링컨테이너의 관리대상이 아니게 된다
- 그래서 싱글톤빈에 무언가 요청할 때 주입받은 프로토타입빈은 처음에 주입받은 빈을 그대로 사용하기때문에 매번 생성하게 되는 의도랑은 전혀 관계 없게 된다.
- 여기서는 ClientBean(싱글톤 빈)의 생성시점에 프로토타입빈이 주입된다. 그러고 관리가 끝난다.
- 싱글톤 빈에서 프로토타입 빈 사용 시 싱글톤 빈과 함께 프로토타입 빈이 유지되는 것이 문제다.
4. 사용할때마다 새로 생성하려면 ? Provider
- logic() 메서드에서 ac.getBean(PrototypeBean.class); 해서 가져오는것도 가능함 (프로토타입을 사용할 때마다 스프링컨테이너에 요청) -> Dependency Lookup(의존관계 조회) 라고 한다.
- DL을 대신해주는 것이 있다.
- ObjectFactory , ObjectProvider
- ObjectFactory 라고 해도 됨
- @Autowired는 왜저러는지 모름
- 결론적으로 프로토타입빈을 사용하는 경우는 매우 드물다.
- ObjectProvider, JSR-330 의 표준 방법 등은 프로토타입 뿐만 아니라 DL이 필요한 경우에는 언제든지 사용이 가능하다.
'Backend - Java Spring > Spring Core 핵심원리(완)' 카테고리의 다른 글
[SpringCore 핵심원리] 웹스코프 (0) | 2024.02.18 |
---|---|
[SpringCore 핵심원리] 빈 생명주기 콜백 (0) | 2024.02.17 |
[SpringCore 핵심원리] List, Map (0) | 2024.02.17 |
[SpringCore 핵심원리] 애너테이션 (0) | 2024.02.17 |
[SpringCore 핵심원리] 생성자주입과 롬복 (0) | 2024.02.17 |
댓글