bean 스코프에는 singleton과 prototype이 있죠.
그런데 prototype 은 .getBean()을 할때 생성되는데, 이게 어디에 쓰이는지 잘 모르겠습니다.
아래 코드로 질문드립니다.
@Service
public class SingletonService {
@Autowired
private ProtoService protoService;
}
@Service
@Scope("prototype")
public class ProtoService {
}
코드를 설명하자면..
1. SingletonService, ProtoService 2개의 @Service를 등록했고 각각 지 이름처럼 스코프를 설정했습니다.
2. SingletonService 안에 ProtoService를 주입 받을수 있게 하였습니다.
이때 빈의 생성은 다음과 같이 이루어 집니다.
1. 앱 구동시 스캔되어 BeanFactory에 빈으로 등록 되는데, 위 2개 클래스중 스코프가 singleton인 SingletonService만 먼저 등록 됩니다.
2. prototype 스코프인 ProtoService 빈은 .getBean() 할때 생성 되는데, 마침 SingletonService의 멤버변수 @Autowired Prototype 로 주입을 받고 있고, ApplicationContext.getBean(ProtoService.class)으로 가져올 것입니다. 이렇게 주입 시점에 ProtoService 빈이 새로 하나가 생성 됩니다.
여기까지가 제가 알고있는 개념입니다.
그런데 이 개념만으로는 당췌 prototype을 어떻게 써먹을지 모르겠습니다.
이미 SingletonService 가 싱글톤이라 더이상 생성되지도 않고, ApplicationContext 가 close 되지 않는 이상 소멸되지도 않습니다.
SingletonService 가 의존하고 있는 PrototypeService 처음 주입후 새로 생성될 기회가 없기에 영원히 싱글톤으로 동작하는거죠.
대체 어떨때 prototype 스코프를 쓰게되는지 잘 모르겠습니다.
설마 ApplicaitonContext.getBean() 을 그냥 쓰는건가요 ?? 별로 나이스해 보이진 않는데 어떻게들 사용하시는지 모르겠습니다.
사용한 사례가 있으시다면 알려주시면 감사하겠습니다.