@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 는 새로운 해시코드가 발급된 여러 개의 인스턴스로 출력되는 것을 볼 수 있습니다.

 

 

Prototype vs Singleton

 

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