첫번째 해결방안은 Provider를 사용하는 것입니다.
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final LogDemoService logDemoService;
private final ObjectProvider<MyLogger> myLoggerProvider;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request) {
String requestURL = request.getRequestURL().toString();
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
}
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggerProvider;
public void logic(String id) {
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.log("service id = " + id);
}
}
[871922ad-4ca3-4c47-91fd-ca8db134ac15] request scope bean create:hello.core.common.MyLogger@6be579a5
[871922ad-4ca3-4c47-91fd-ca8db134ac15][http://localhost:8080/log-demo] controller test
[871922ad-4ca3-4c47-91fd-ca8db134ac15][http://localhost:8080/log-demo] service id = testId
[871922ad-4ca3-4c47-91fd-ca8db134ac15] request scope bean close:hello.core.common.MyLogger@6be579a5
ObjectProvider
덕분에ObjectProvider.getObject()
를 호출하는 시점까지 request scope빈의 생성을 지연
할 수 있습니다.ObjectProvider.getObject()
를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리됩니다.ObjectProvider.getObject()
를LogDemoController
,LogDemoService
에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환됩니다.
참조
'Spring' 카테고리의 다른 글
[스프링 핵심 원리 - 기본편] 스코프와 프록시 (0) | 2021.09.21 |
---|---|
[스프링 핵심 원리 - 기본편] request 스코프 예제 만들기 (0) | 2021.09.21 |
[스프링 핵심 원리 - 기본편] 웹 스코프 (0) | 2021.09.21 |
[스프링 핵심 원리 - 기본편] 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결 (0) | 2021.09.21 |
[스프링 핵심 원리 - 기본편] 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점 (0) | 2021.09.21 |
댓글