09 빈 스코프

p119 - src/test/java/spring/basic/scope/ScopeTest

public class ScopeTest {
    @Test
    void getBeanTest() {
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(ProtoType.class);

        ProtoType bean1 = ac.getBean(ProtoType.class);
        ProtoType bean2 = ac.getBean(ProtoType.class);
        Assertions.assertThat(bean1).isNotSameAs(bean2);

        // 컨테이너 종료
        ac.close();

        bean1.destroy();
        bean2.destroy();
    }

    @Scope("prototype")
    @Component
    static class ProtoType {
        @PostConstruct
        void init(){
            System.out.println("ProtoType.init");
        }

        @PreDestroy
        void destroy() {
            System.out.println("ProtoType.destroy");
        }
    }
}

p122(왼쪽이미지) - build.gradle

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.3'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'spring'
version = '0.0.1-SNAPSHOT'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(21)
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}

p122(오른쪽이미지) - src/main/java/spring/basic/controller/RequestBean

@Component
//@Scope(value = "request")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestBean {
    private String value;

    public RequestBean() {
        this.value = UUID.randomUUID().toString();
    }

    public String getValue() {
        return value;
    }

    @PostConstruct
    public void init() {
        System.out.println("RequestBean 생성됨: " + value);
    }

    @PreDestroy
    public void destroy() {
        System.out.println("RequestBean 소멸됨: " + value);
    }
}

p123(왼쪽이미지) - src/main/java/spring/basic/controller/RequestScopeController

@RestController
@RequestMapping("/api")
public class RequestScopeController {
    private final ObjectProvider<RequestBean> requestBeanObjectProvider;

    @Autowired
    public RequestScopeController(ObjectProvider<RequestBean> requestBeanObjectProvider) {
        this.requestBeanObjectProvider = requestBeanObjectProvider;
    }


    @GetMapping("/request-scope")
    public String getRequestScope() {
        RequestBean requestBean = requestBeanObjectProvider.getObject();
        System.out.println("requestBean.getValue() = " + requestBean.getValue());
        return "Request scope bean value: " + requestBean.getValue();
    }
}

p123(오른쪽이미지) - src/main/java/spring/basic/BasicApplication2

@SpringBootApplication
public class BasicApplication2 {
	public static void main(String[] args) {
		SpringApplication.run(BasicApplication2.class, args);
	}

}

p126 - src/main/java/spring/basic/controller/RequestScopeController

@RestController
@RequestMapping("/api")
public class RequestScopeController {

    private final RequestBean requestBean;

    @Autowired
    public RequestScopeController(RequestBean requestBean) {
        this.requestBean = requestBean;
    }

    @GetMapping("/request-scope")
    public String getRequestScope() {
        System.out.println("requestBean.getValue() = " + requestBean.getValue());
        return "Request scope bean value: " + requestBean.getValue();
    }

}

p126 - src/main/java/spring/basic/controller/RequestScopeController

@RestController
@RequestMapping("/api")
public class RequestScopeController {
    private final ObjectProvider<RequestBean> requestBeanObjectProvider;

    @Autowired
    public RequestScopeController(ObjectProvider<RequestBean> requestBeanObjectProvider) {
        this.requestBeanObjectProvider = requestBeanObjectProvider;
    }


    @GetMapping("/request-scope")
    public String getRequestScope() {
        RequestBean requestBean = requestBeanObjectProvider.getObject();
        System.out.println("requestBean.getValue() = " + requestBean.getValue());
        return "Request scope bean value: " + requestBean.getValue();
    }
}

Last updated