프로토타입 스코프의 빈은 클라이언트가 요청하면 새로운 객체 인스턴스를 생성하여 반환해주는데, 싱글톤 스코프의 빈과 같이 사용할 경우 의도한 대로 동작하지 않는다는 문제가 있다.
먼저 스프링 컨테이너에 프로토타입 스코프의 빈을 직접 요청하는 과정을 정리해보았다.
1. 클라이언트 A가 스프링 컨테이너에게 프로토타입 빈을 요청
2. 스프링 컨테이너는 프로토타입 빈(x01)을 새로 생성하여 반환, 해당 빈의 변수 count는 0
3. 클라이언트 A는 조회한 프로토타입 빈에 addCount()를 호출해서 count+1
4. 결과, 프로토타입 빈(x01)의 count는 1
1. 클라이언트 B가 스프링 컨테이너에게 프로토타입 빈 요청
2. 스프링 컨테이너는 프로토타입 빈(x02)을 새로 생성하여 반환, 해당 빈의 변수 count는 0
3. 클라이언트 A는 조회한 프로토타입 빈에 addCount()를 호출해서 count+1
4. 결과, 프로토타입 빈(x02)의 count는 1
clientBean 내부에 프로토타입 빈을 의존 관계 주입으로 사용할 경우,
static class ClientBean{
// 생성 시점에 주입됨
private final PrototypeBean prototypeBean;
...
}
참고
여러 빈에서 같은 프로토타입 빈을 주입 받는 경우, 주입 받는 시점에 각각 새로운 프로토타입 빈이 생성된다.
- Ex) clientA, clientB가 각각 의존관계 주입을 받으면 각각 다른 인스턴스의 프로토타입 빈을 주입 받는다.
clientA -> prototypeBean@x01
clientB -> prototypeBean@x02
그리고 사용할 때마다 새로 생성되지 않는다.