스프링에서는 빈의 스코프를 싱글톤, 프로토 타입 등으로 설정이가능하며 그에 따라 속해있는 빈들이 상태가 변경될 수 있다.
- 빈을 등록하면 기본값이 싱글톤이므로 싱글톤으로 등록이된다.
문제점
싱글톤 객체를 사용하게 되면 공유되므로 멀티쓰레드 환경에서 쓰레드세이프하지 않다.
@Component @Scope("prototype") public class MyProtoBean { }
- Proto를 @Scope를 통해 prototype으로 지정한다.
- 서로 다른 인스턴스가 생성된다.
Singleton Bean에 PrototypeBean을 주입하게되면 어떻게 될까?
- PrototypeBean임에도 불구하고 같은 인스턴스가 주입된다.
해결방법
@Component @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) public class MyProtoBean { }
- 위와 같이 하게되면 Singleton객체가 Prototype객체를 직접 참조하는게 아닌 Proxy를 통해 참조하게 되기 때문에 다른 빈이 생성되게 된다.