文章出處

看似很簡單的一個問題,借此追蹤下spring的源碼處理

 

在寫springMVC的Control中有很多這種代碼, 如需要獲取request對象去做某些事情

如:

@Controller
@RequestMapping(value = "/user") 
public class LoanActionPage extends AbstractAction {

@RequestMapping(value = "/page/active") 
public String loanAaccountActivePage(HttpServletRequest request) { 
// get  request to  dosomething
String pathInfo = request.getPathInfo();
return "active"; 
}

}

  

 

貌似每次要寫個control時都得把request當住參數來傳,很是冗余。

其實可以在control里定義一個request對象,注入,然后隨時用

 

如:

public class  AbstractAction {
 @Autowired 
protected HttpServletRequest request;

... ...

  

然后在control中直接用:

@Controller
@RequestMapping(value = "/user") 
public class LoanActionPage extends AbstractAction {

@RequestMapping(value = "/page/active") 
public String loanAaccountActivePage() { 
// get  request to  dosomething
String pathInfo = request.getPathInfo();
return "active"; 
}
}

 

 

那么問題來了,sevlet是多線程的,每次請求的request其實是個新的對象,這樣直接共享引用,是否會造成線程不安全呢?

 

方便了,問題也來了,servelt其實是多線程,共享一個request是否會有安全問題呢,分析下spring的代碼

 

 

 

1, 注入的request何處來?

 

發現是注入其實是往WebApplicationContextUtils通過RequestObjectFactory拿值,跟蹤

返回的是RequestContextHolder里的值. 追蹤RequestContextHolder

 

每次返回的其實是, RequestAttributes的實現類ServletWebRequest(ServletRequestAttributes)里的request. 因為RequestAttributes是屬于threadLocal的,所以注入的request也是線程安全的了

 

2, spring何時設置的request對象?

 

HttpServlet實現類 FrameworkServlet-> service()->processRequst()

 

 

每次請求都會往里面設置最新的request, 設值

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()