이번 포스팅에서는 Spring Bean의 스코프에 대해서 기록해 보겠습니다.
하나는 일반 @Component를 사용하고 다른 하나는 @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)를 사용하여 프로토 타입 Spring Bean으로 만듭니다.
package com.in28minutes.learnspringframework.example.e1;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
class NormalClass {
}
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
class PrototypeClass {
}
@Configuration
@ComponentScan
public class BeanScopeLauncherApplication {
public static void main(String[] args) {
try (var context = new AnnotationConfigApplicationContext
(BeanScopeLauncherApplication.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));
}
}
}
com.in28minutes.learnspringframework.example.e1.NormalClass@4bb33f74
com.in28minutes.learnspringframework.example.e1.NormalClass@4bb33f74
com.in28minutes.learnspringframework.example.e1.PrototypeClass@759d26fb
com.in28minutes.learnspringframework.example.e1.PrototypeClass@3c73951
com.in28minutes.learnspringframework.example.e1.PrototypeClass@3d5c822d
@Component로 생성한 NormalClass의 경우 @4bb33f74로 하나의 해시코드를 가집니다.
하지만, PrototypeClass를 보면 해시코드가 모두 다릅니다.
기본적으로 Spring Framework에서 생성되는 모든 Bean은 싱글톤입니다.
싱글톤은 Bean을 요청할 때마다 같은 인스턴스가 반환됩니다.
싱글톤은 Spring IoC 컨테이너당 객체 인스턴스가 딱 하나입니다.
하지만, 프로토타입은 Spring IoC 컨테이너에 여러 객체 인스턴스가 있을 수 있습니다.
Bean을 요청할 때마다 특정한 Bean의 새 인스턴스를 반환합니다.
Sprig IoC 컨테이너에서 같은 인스턴스를 다시 사용하고 싶다면 싱글톤 스코프를 사용하면 됩니다.
Bean 요청마다 새로운 인스턴스를 사용하고 싶다면 프로토타입 스코프를 사용하면 됩니다.