작성
·
534
·
수정됨
1
강의 교안 <9.빈 스코프>의 28페이지를 보면 다음과 같이 설명되어있습니다.
"ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다"
이 때, 빈의 생성을 지연한다는 말이 실제로 getObject() 함수를 호출해야만 request scope의 MyLogger 빈이 만들어 진다는 건가요?
아니면 http 요청이 들어오는 순간 이미 MyLogger 빈은 다른 로직에 의해 생성되어 존재함이 보장되고, getObject() 함수는 무조건 MyLogger 빈을 갖고 올 수 있기 때문에 이를 논리적으로 "빈의 생성을 지연한다"라고 표현하신 건가요?
전자가 맞는지 후자가 맞는지 궁금합니다.
*추가. 비슷한 질문이 있어서 해당 질문을 참고하여 내용을 추가하였습니다.
https://www.inflearn.com/questions/702458
위의 질문에서 "http요청이 들어왔을 때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는것이다" 라는 답변이 있었습니다. 그래도 이해가 안되서, getObject() 함수가 호출되기 전에 getBean()으로 등록된 MyLogger 빈을 갖고와봤습니다.
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final ObjectProvider<MyLogger> myLoggerProvider;
// 추가된 라인
private final ApplicationContext ac;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request) {
// 추가된 라인
MyLogger testMyLogger = ac.getBean(MyLogger.class);
// 추가된 라인
System.out.println(testMyLogger);
String requestURL = request.getRequestURL().toString();
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
LogDemoService.logic("testID");
return "OK";
}
}
ApplicationContext를 의존주입 받아서,
getObject()가 호출되기 전에 getBean()으로 MyLogger 타입의 스프링 빈을 조회하고 출력하였는데,
testMyLogger와 myLogger에 동일한 객체가 들어있었습니다.
위의 답변과는 상충되는 결과인데, 제가 추가한 코드에 문제가 있는 건가요?
안녕하세요 영한님. 항상 친절한 답변 감사드립니다.
답해주신 부분에 대해서는 이해가 잘 되었습니다.
추가적으로 하나만 더 질문드리고 싶은게 생겨서 질문 드립니다.
제가 위에 적어놓은 코드에서는 ac.getBean() 에 의해서 request scope의 빈이 최초 조회되기 때문에 그때 빈이 생성되는 것이고, 코드의 아래 부분의 myLoggerProvider.getObject()에서는 위의 getBean()에 의해 생성되었던 빈과 동일한 빈이 반환되는 건가요?