빈 스코프
빈이 존재할 수 있는 범위
@Scope("singletone")
static class BeanScopeEx {
}
@Scope("prototype")
static class BeanScopeEx {
}
스프링 컨테이너는 프로토타입 빈의 생성과 의존관계 주입까지만 관여하고
그 이후는 관리하지 않음 👉 @PreDestroy 같은 종료 메서드 호출 X
매우 좁은 범위의 스코프
요청시마다 새로운 인스턴스를 생성하여 반환
프로토타입 빈을 주입 시점에만 새로 생성하는게 아니라, 사용할 때 마다 새로 생성해서 사용하려면 ?
ObjectProvider
ObjectProvider 의 getObject() 를 호출하면
지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스를 제공
ObjectFactory 에 편의 기능을 추가한 것
스프링이 제공하는 기능을 사용하며 기능이 단순
단위테스트, mock 코드를 만들기 쉬움
DL (Dependency Lookup)
의존관계를 외부에서 주입(DI) 받는게 아니라 직접 필요한 의존관계를 찾는 것
javax.inject.Provider 라는 JSR-330 자바 표준을 사용
스프링이 아닌 다른 컨테이너에서도 사용 가능
javax.inject:javax.inject:1 라이브러리를 gradle에 추가하여 사용
provider.get() 을 통해서 항상 새로운 프로토타입 빈이 생성됨
기능이 단순하여 단위테스트, mock 코드를 만들기 쉬움
스프링이 더 다양하고 편리한 기능을 제공해주기 때문에
특별히 다른 컨테이너를 사용할 일이 없다면 스프링이 제공하는 기능을 사용
implementation 'org.springframework.boot:spring-boot-starter-web'
🔎 라이브러리 추가시 스프링 부트는 내장 톰캣 서버를 활용하여 웹 서버와 스프링을 함께 실행
웹 라이브러리 X : AnnotationConfigApplicationContext 기반으로 구동
웹 라이브러리 O : AnnotationConfigServletWebServerApplicationContext 기반으로 구동
HTTP 요청 하나가 들어오고 나갈때 까지 유지되는 스코프
각 HTTP 요청마다 별도의 빈 인스턴스가 생성, 관리됨
HTTP Session과 동일한 생명주기를 가지는 스코프
서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프
웹 소켓과 동일한 생명주기를 가지는 스코프