@Controller
public class AController{
@Autowire
HttpServletRequest request;
@RequestMapping("/test")
public Result test(){
System.out.println(request.toString());
request.getHeader("uid");
}
}
例如上述代码,
我使用Autowire
注入request
后,直接在controller
的方法中使用request
,
由于controller
默认是单例的,我在想是否会有线程安全问题。
因为我输出了request
的hashcode
发现每次请求hashcode
都是一样的。
那么后面的request
是否会覆盖当前request
导致信息失真?
·····························补充··························
1、我想在controller
的每个方法里都使用HttpServletRequest
,那么每次在方法里都要声明我觉得就比较麻烦了?不知道大家怎么解决这个问题?
2、我这样写的原因是,我想通过继承一个父类的方式,让request作为父类的一个成员变量,这样可以在方法里直接使用。
3、我通过楼下叉叉哥的方式(之前就是这样写的)
public Result test(HttpServletRequest request){
System.out.println(request.toString());
}
同样不断访问,或者用不同客户端访问。发现打印出来的每个请求的request的hashcode居然也是相同的,为什么?
답변해 주셔서 감사합니다
테스트와 탐색을 거친 후입니다.
결론은
@autowire
을 사용하여 HttpServletRequest를 주입하는 것이 스레드로부터 안전하다는 것입니다.구체적인 검증 과정에 대해 블로그에 작성했습니다
관심 있으신 분들은 살펴보시고 잘못된 부분이 있으면 지적 부탁드립니다.
제 질문에 열정적으로 답변해주신 윗층 프로그래머분들께 다시한번 감사드립니다
블로그 주소를 보려면 저를 클릭하세요
ps: 위의 논의는 모두 싱글톤 모드의 컨트롤러에 관한 것입니다
···
우선 원칙적으로 Request는 Controller의 멤버로 정의될 수 없습니다. 왜냐하면 두 수명 주기가 완전히 연결되어 있지 않기 때문입니다. 이로 인해 Controller는 올바른 Request 객체를 호출할 수 없게 됩니다.
둘째, @Autowire는 일회성 할당이고 수많은 Request 객체가 있기 때문에 이렇게 작성하면 Spring이 어떻게 해야 할지 모르게 됩니다. 애플리케이션이 시작될 때 Request 개체가 없기 때문에 이로 인해 시작이 실패하게 됩니다.
음, 매번 같은 문제
request
를 푸는 데만 집중하다가 주제를 잊어버리게 되어서 제 자신을 바보로 만들었습니다.추가
@ModelAttribute
스레드 안전성 문제가 있는 것은 사실!...
객체 속성을 사용하고 스레드 안전성을 처리하려는 경우 매우 간단한 방법이 있지만 특히 까다롭습니다 이를 직접 사용하여
그런 방법이기는 한데 모두가 당황스럽네요. 죄송합니다.@Scope("prototype")
Spring MVC에서 새 속성을 생성하도록 합니다. 각 요청은 엔터티 클래스입니다...그런데 Spring MVC에는 왜 기본적으로 싱글톤이 필요한가요? 당연히 싱글턴의 성능과 비용상의 이점 때문에
을 쓴다는 것은 싱글턴의 장점을 포기한다는 의미입니다.
@Scope("prototype")
으아아아
1. Autowire가 요청을 삽입한 후 인스턴스 변수를 사용할 때 보안 문제가 발생합니다
2. 요청을 덮어씁니다
3. 해시코드는 여전히 동일합니다
메소드에 매개변수를 작성하는 것이 번거롭다고 생각하니 이렇게 하시면 됩니다.
으아아아이런 글은 처음 봤습니다. 이렇게 써보면 어떨까요?
으아아아사실 대부분의 경우 요청을 매개변수로 전달할 필요가 없습니다. 예를 들어 요청 헤더에서 uid를 가져오려면 다음과 같이 작성하면 됩니다.
으아아아그런 식으로 작성하면 스프링의 각 컨트롤러는 기본적으로 싱글톤이므로 요청이 다른 스레드에서 공유되므로 반드시 스레드 안전성 문제가 발생하므로 다음과 같은 방식으로 작성하는 것이 좋습니다. @ChaCha哥.
있을 겁니다. 서블릿에서는 속성 매개변수가 메소드에 작성되어 공유되지 않습니다
이렇게 작성하면 컨트롤러가 기본적으로 싱글톤이기 때문에 확실히 스레드 안전 문제가 발생합니다. 즉, @Scope("prototype")를 추가하면 여러 요청이 HttpServletRequest 객체를 공유하게 됩니다. 문제없어요
스레드 안전 문제가 있을 수 있으니 http://www.xuebuyuan.com/1628190.html
기사를 읽어보세요.모든 클래스 인스턴스 변수에는 잠재적인 스레드 안전 위험이 있습니다. 코드에서는 인스턴스 변수가 여러 스레드에서 안전한지 확인하거나 동시에 하나의 스레드에서만 클래스에 액세스하도록 해야 합니다.
귀하의 예제에서 멀티스레딩 문제는 불가피합니다. Spring 튜토리얼을 따라 표준 방식으로 작성하고 먼저 이해한 다음 복잡한 작업으로 넘어가세요.