는 범위 내가 @Autowired
푸 자체 선언 할 필요가 HttpSession에 또는 HttpServletRequest의, 않습니다 세션 (또는 요청)와 싱글 @Component
콩 "푸"한 곳 경우, 또는 나는 그냥 --- 간단한 싱글로 유지할 수 있습니다 어떤 경우 HttpSession 및/또는 HttpServletRequest가 이미 Spring을 통해 범위가 지정된 프록시로 주입되었을 가능성이 있습니까?스프링 프록시 요청 속성이 있습니까?
답변
가 여기에 동작을 확인하는 아주 간단한 테스트입니다 (봄 4.0.0.RELEASE)
@Controller
@RequestMapping("/service")
public class NewController {
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody String test(ModelMap model) {
System.out.println(requestEntity.request.getAttribute("type")); // get it
requestEntity.request.setAttribute("type", "Scope"); // set it so that we can make sure that our second request doesn't contain it
System.out.println(requestEntity.request.getClass());
return "whatever";
}
@Autowired
private Foo requestEntity;
}
당신이 요청을 보낼 경우, 반환되는 속성이 있음을 알게 될 것이다
@Component
public class Foo {
@Autowired
public HttpServletRequest request;
}
항상 null
이고 수업은 다음과 같음을 의미합니다.
class com.sun.proxy.$Proxy19
그러므로 항상 ge @Component
콩이 싱글 톤 범위 임에도 불구하고 다른 HttpServletRequest
개체를 지정합니다. 당신이 WebApplicationContent
를 인스턴스화 할 때, 기본 BeanFactory
일부 웹 유형을 해결하기위한 몇 가지 특별한 ObjectFactory
인스턴스를 등록
:
다음은 설명입니다. 이는 WebApplicationContextUtils.registerWebApplicationScopes(..)
에서 이루어집니다. 이 중 하나는 봄이 당신의 bean을 검색하고 필드 (ServletRequest
의 하위 유형)을 HttpServletRequest
, 그것은 분해 종속성의지도에서보고이를 얻을 것이다 autowire하기 위해 필요하다고 판단하면
beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory());
다음 RequestObjectFactory
.
이것은 ObjectFactory
이고 주입 대상이 인터페이스 유형이므로 Spring은 각 요청에 대해 RequestObjectFactory
에 의해 생성/반환 된 객체에 위임하는 해당 유형의 프록시를 만듭니다. 이것은 AutowireUtils.resolveAutowiringValue(..)
에서 이루어집니다.
이와 같이, Foo
빈은 요청 범위가 될 필요가 없습니다.
스프링은 프록시를 사용합니다. 그렇습니다. Spring은 싱글 톤에 프록시를 삽입하여 싱글 톤 범위의 객체에 요청 또는 세션 범위의 객체를 삽입 할 수있게합니다.
스프링 MVC의 경우, 주입 된 프록시는 각 요청이 스레드에 바인드되어 있기 때문에 ThreadLocal
변수로 뒷받침된다고 생각합니다. 실제 HttpServletRequest
은 호출 될 때 ThreadLocal
에 위임 한이 주입 된 프록시를 통해 사용할 수 있습니다.
따라서 "Foo"를 세션 또는 요청 범위로 선언 할 필요가 없으며이를 Singleton으로 유지할 수 있습니다.
- 1. 스프링 프록시 디버깅 문제
- 2. Spring에 스프링 게으른 프록시 팩토리가 있습니까?
- 3. 스프링 트랜잭션 - 프록시 혼동
- 4. 스프링 4 강제 속성이 정의됩니다.
- 5. Zuul 프록시 뒤에있는 스프링 -
- 6. 스프링 AOP 프록시
- 7. 인터페이스의 스프링 프록시 beans
- 8. 스프링 스코프 프록시 및 JAXB
- 9. "프록시"HTTP 요청
- 10. 프록시 SQL Server 요청
- 11. C# 웹 프록시 요청
- 12. Nginx에 프록시 : 루트 요청
- 13. Tomcat 및 프록시 요청
- 14. AWS 요청 프록시 도구
- 15. 스프링 확인란이 선택된 속성이 없습니다.
- 16. Twisted - 다른 프록시 (프록시 체인)에 프록시 요청 전달
- 17. 스프링 AOP - 프록시 생성 오류
- 18. 스프링 통합을위한 JavaMail 프록시 설정
- 19. 스프링 MVC 투명한 리소스 프록시
- 20. 프록시 요청 제한 시간 설정
- 21. 대상 유형이있는 spring.net 프록시 팩토리에는 가상 속성이 필요합니까?
- 22. 꼬인 프록시 요청 수정 방법
- 23. Jaxer 및 HTTP 프록시 요청
- 24. 스프링 MVC - 요청 매핑
- 25. 스프링 리디렉션 요청 매핑
- 26. 스프링 요청 동기화 됨
- 27. 스프링 도조 요청 문제
- 28. 스프링 요청 매핑 Mis
- 29. 스프링 MVC 바인딩 요청
- 30. 스프링 400의 잘못된 요청