@Scope
2023. 5. 30. 17:59ㆍ기술 창고/어노테이션 창고
728x90
SMALL
@Scope
기본적으로 Spring에서 Bean 객체 인스턴스를 생성할 때 하나의 인스턴스만을 생성하고 그것을 재활용하는 Singleton 방식으로 운영됩니다.
Bean 객체 생성 사용 방식에는 대표적으로 Singleton, Prototype이 있는데,
Singleton 은 앞서 말한 것처럼 하나의 Bean 객체 인스턴스만을 생성하여 재활용하는 방식입니다.
즉, Spring IOC 컨테이너 당 객체 인스턴스가 하나만 존재합니다.
Prototype 은 Bean 객체 인스턴스를 요청할 때마다 새로 생성해서 사용하는 방식입니다.
즉, Spring IOC 컨테이너 당 여러개의 객체 인스턴스가 존재할 수 있습니다.
기본적으로 Spring 은 Singleton 방식을 채택하고 있지만, 만약 Prototype으로 객체 인스턴스를 계속 새로 생성해서 사용하고 싶다고 한다면 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) 을 통해 객체 클래스에 적용시켜 Prototype 객체로 사용할 수 있습니다.
// Spring bean Scope
// Singleton(기본) : 하나의 Bean 객체 인스턴스를 재활용해서 사용하는 방식
// Prototype : Bean 객체 인스턴스를 요청할 때마다 새로 생성해서 사용하는 방식
// Singleton 은 Spring IOC 컨테이너 당 객체 인스턴스가 하나만 존재
// Prototype 은 Spring IOC 컨테이너에 여러개의 객체 인스턴스가 존재할 수 있음.
@Component
class NormalClass{
}
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) // 생성되는 Bean 객체를 Prototype으로 계속해서 새로 생성하는 방식으로 사용하고 싶다면 @Scope (value = Prototype) 사용
class PrototypeClass{
}
@Configuration
@ComponentScan
public class BeanScopesLauncherApplication {
public static void main(String[] args) {
try (var context = new AnnotationConfigApplicationContext(BeanScopesLauncherApplication.class)) {
System.out.println(context.getBean(NormalClass.class));
System.out.println(context.getBean(NormalClass.class));
System.out.println(context.getBean(PrototypeClass.class));
System.out.println(context.getBean(PrototypeClass.class));
System.out.println(context.getBean(PrototypeClass.class));
}
}
}
사진에 보이는 것처럼 실행했을때 일반적인 Singleton 객체인 NormalClass 는 동일한 해시코드를 가진 하나의 인스턴스라고 볼 수 있고, Prototype 인 PrototypeClass 는 새로운 해시코드가 발급된 여러 개의 인스턴스로 출력되는 것을 볼 수 있습니다.
728x90
반응형
LIST
'기술 창고 > 어노테이션 창고' 카테고리의 다른 글
@Named / @Inject (ft. CDI) (0) | 2023.05.31 |
---|---|
@PostConstruct / @PreDestroy (0) | 2023.05.30 |
@Lazy (0) | 2023.05.30 |
@Primary (0) | 2023.05.30 |
@Qualifier (0) | 2023.05.30 |