-
Bean의 스코프SPRING/스프링프레임워크 핵심개념 2021. 5. 13. 00:16
Singleton Scope :
하나의 인스턴스를 사용하는 Scope
@Component public class Single { @Autowired Proto proto; public Proto getProto() { return proto; } } @Component public class Proto { } @Component public class AppRunner implements ApplicationRunner { @Autowired Single single; @Autowired Proto proto; @Override public void run(ApplicationArguments args) throws Exception { System.out.println("proto"); System.out.println(proto); System.out.println("single"); System.out.println(single.getProto()); } }
위의 single과 proto는 싱글톤 스코프이기 때문에 값이 동일하다. (주소값)
prototype scope
: 매번 새로운 인스턴스를 생성하여 사용하는 Scope
@Component public class Single { @Autowired Proto proto; public Proto getProto() { return proto; } } @Component @Scope(value = "prototype", proxyMode = ScopedProxyMode.TARGET_CLASS) public class Proto { } @Component public class AppRunner implements ApplicationRunner { @Autowired ApplicationContext ctx; @Override public void run(ApplicationArguments args) throws Exception { System.out.println("proto"); System.out.println(ctx.getBean(Proto.class)); System.out.println("single"); System.out.println(ctx.getBean(Proto.class)); System.out.println("proto by single"); System.out.println(ctx.getBean(Single.class).getProto()); System.out.println(ctx.getBean(Single.class).getProto()); System.out.println(ctx.getBean(Single.class).getProto()); } }
위와 같이 @Scope("prototype")를 명시하면 매번 새로운 인스터스를 생성한다.
또한, Singleton타입의 빈이 prototype의 빈을 참조할 때에 매번 새로운 인스턴스를 생성하고 싶으면, proxyMode를 위와 같이 설정하면 된다.
TIP.
Singleton 객체를 사용할 때 주의점
1. Property 공유
- 멀티 쓰레드 환경에서 여러 쓰레드가 Property 를 공유할 수 있기 때문에 값의 동기화가 되지 않을 수 있다.
- Thread-safe한 방법으로 코딩이 필요함.
'SPRING > 스프링프레임워크 핵심개념' 카테고리의 다른 글
Environment - 프로퍼티 (0) 2021.05.14 Environment - 프로파일 (0) 2021.05.14 @Component와 컴포넌트 스캔 (1) 2021.05.09 @Autowired를 이용한 의존성 주입 (0) 2021.05.09 다양한 Bean 주입 방법 (0) 2021.05.08