프록시는 대신 처리해주는? 그런 뜻임.
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {
private String uuid;
private String requestURL;
public void setRequestURL(String requestURL){
this.requestURL = requestURL;
}
public void log(String message){
System.out.println("[" + uuid + "]" + "["+requestURL+"]"+message);
}
@PostConstruct
public void init(){
uuid = UUID.randomUUID().toString();
System.out.println("[" +uuid + "] request scope bean create: " + this);
}
@PreDestroy
public void close(){
System.out.println("[" +uuid + "] request scope bean close: " + this);
}
}
이렇게 프록시 모드 해주면 됨.
참고로 원래는 "request" 저거 혼자면 value = 굳이 이렇게 안해도 되는데 여러개 속성 넣을려면 저렇게 해야 함.
그리고 만약 class가 아니고 인터페이스면 proxyMode = ScopedProxyMode.INTERFACES 이렇게 해주면 됨.
저렇게 해주면, 저게 진짜 로직은 가지고 있고 종속성 주입하는 순간은 가짜로 처리해 줌. 요청되었을 때 진짜 로직 실행
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request){
String requstURL = request.getRequestURI();
System.out.println("myLogger = " + myLogger.getClass());
myLogger.setRequestURL(requstURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
저거 System.out.println("myLogger = " + myLogger.getClass()); 해서 찍어보면,
myLogger = class co m.example.core.common.MyLogger$$SpringCGLIB$$0
이렇게 나옴. 맞음. 뭔가 spring이 저걸 상속 받아서 만든거임.
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
51강. request scope Provider 이용 (0) | 2023.07.25 |
---|---|
50강. request 스코프 (0) | 2023.07.25 |
49강. 웹 스코프 (0) | 2023.07.24 |
48강. Provider (0) | 2023.07.24 |
47강. 프로토타입빈을 싱글톤 빈과 사용할 때 문제 (0) | 2023.07.24 |