반응형
스코프
- 싱글톤 ( 기본값 ) : 오직 하나의 인스턴스
- 프로토타입 ( @Scope("prototype") 추가해줘야함. ) : 매번 다른 인스턴스 객체
- Request
- Session
- WebSocket
- ...
싱글톤
proto 는 AppRunner가 주입받은 인스턴스이고, single.getProto() 는 Single클래스에서 직접 주입 시켜준 인스턴스이다.
결과
결과는 당연히 싱글톤이므로 하나의 객체가(똑같은 객체가) 찍힌다.
프로토타입
@Scope("prototype")을 지정해주고
Proto 객체와 Single 객체 를 각각 3번 출력해보았다.
결과는 역시 싱글톤은 매번 같은 객체가 나오는 반면, 프로토타입은 매번 다른 객체가 나오는걸 알수있다.
프로토타입 빈이 싱글톤 빈을 참조하면?
- 아무 문제 없음.
싱글톤 빈이 프로토타입 빈을 참조하면?
- 프로토타입 빈이 업데이트가 안된다
싱글톤에서는 업데이트가 안되는 것을 확인할 수 있다.
- 업데이트 하게 하려면
- scope-proxy
- Object-Provider
- Provider(표준)
업데이트 되게 하는 방법 1 ) proxyMode = ScopeProxyMode.TARGET_CLASS (기본값 : DEFAULT)
어떤 원리 일까?
프록시를 거쳐서 프로토 클래스를 참조하게 된다. 왜? 매번 다른 객체로 바꿔줄 여지가 없기 때문에.. 그렇게 하기 위해서 프록시로 프로토를 감싸주면 된다.
@Component
public class Single{
@AutoWired
Proto proto; //여기서 proto가 아닌 proxy 빈이 주입이 된다.
public Proto getProto(){
return proto;
}
}
실질적으론 프록시가 빈으로 등록이 되고, proto에는 프록시 빈이 주입이 된다.
싱글톤 객체 사용시 주의할 점
- 프로퍼티가 공유.
@Component
public class Single{
int value = 0; //이 값은 모든 스레드가 공유한다.
}
멀티 스레드 환경에서 싱글톤 객체를 사용할때, value값이 서로 공유가 된다. 코딩할때 ThreadSafety한 방법으로 해야한다.
- ApplicationContext 초기 구동시 인스턴스 생성.
- 모든 싱글톤 스코프의 빈들은 ApplicationContext가 빈을 만들때 인스턴스가 생성이 된다. (그래서 처음 구동시 시간이 걸릴수 있다.)
반응형