1) 클라이언트의 요청
2) 스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 하고 클라이언트에게 반환.(유지 x)
3) 클라이언트가 또 요청한다면, 새로 생성해서 의존관계 주입, 반환
1) 싱글톤 타입 빈이 프로토타입 빈을 의존관계 주입으로 주입받았을때 문제가 발생!
2) 싱글톤 빈이 프로토타입 빈의 참조값을 보관 중
3) A클라이언트의 요청
4) 싱글톤 빈이 프로토타입 빈을 호출
5) B클라이언트의 요청
6) 싱글톤 빈이 같은 프로토타입 빈을 호출
💡 즉 생성 시점에 주입된 프로토타입 빈을 계속 쓴다!!!!
-> 이러면 굳이 프로토타입 빈을 쓸 이유가 없다.
지금 여기서 필요한것은? 항상 새로운 프로토타입 빈을 스프링 컨테이너에 요청하면 됨!
static class ClientBean {
@Autowired private ApplicationContext ac;
public int logic() {
PrototypeBean prototypeBean = ac.getBean(프로토타입이름.class);
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
}
💡DL? 의존관계 검색(Dependency Lookup)
: 의존관계가 필요한 객체에서 직접 검색하는 방식(인터페이스 타입만 지정해서 검색)
@Autowired
private Provider<PrototypeBean> provider;
public int logic() {
PrototypeBean prototypeBean = provider.get();
prototypeBean.addCount();
int count = prototypeBean.getCount();
return count;
}
}
request: 웹 요청이 들어오고 나갈때 까지 유지되는 스코프이다.
session: 웹 세션이 생성되고 종료될 때 까지 유지되는 스코프이다.
application: 웹의 서블릿 컨텍스트와 같은 범위로 유지되는 스코프이다.
websocket: 웹소켓과 동일한 생명주기를 가지는 스코프