스코프와 Provider

김원종·2023년 7월 18일
0

첫번째 해결방법 Provider

@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final ObjectProvider<MyLogger> myLoggerProvider;

    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request){
        MyLogger myLogger = myLoggerProvider.getObject();
        String requestURL = request.getRequestURI().toString();
        myLogger.setRequestURL(requestURL);

        myLogger.log("controller test");
        logDemoService.logic("testID");

        return "OK";
    }
}
@Service
@RequiredArgsConstructor
public class LogDemoService {

    private final ObjectProvider<MyLogger> myLoggeProvider;

    public void logic(String id) {
        MyLogger myLogger = myLoggeProvider.getObject();
        myLogger.log("service id =" + id);
    }
}

main()메서드로 스프링을 실행하고, 웹 브라우저에 http://localhost:8080/log-demo를 입력하자

잘 작동하는것을 확인할 수 있다.

  • ObjectProvider 덕분에 ObjectProvider.gerObject() 를 호출하는 시점까지 request scope 빈의 생성을 지연 할 수 있다.

  • ObjectProvider.getObject() 를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리된다.

  • ObjectProvider.getObject()LogDemoController , LogDemoService 에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환된다! -> 직접 구분하려면 어려움이 따른다!!

profile
개린이

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

소중한 정보 감사드립니다!

답글 달기

관련 채용 정보