天天看點

Spring5源碼,@ModelAttribute

​​一、什麼是@ModelAttribute注解​​

​​二、@ModelAttribute注解相關代碼詳解​​

一、什麼是@ModelAttribute注解

@ModelAttribute注解主要用來将請求轉換為使用此注解指定的對象。例如,如果在@ModelAttribute旁邊指定了一個Article執行個體,則與Article的字段對應的所有請求參數将被用作Article的字段值。什麼意思呢,例如,POST送出後參數title的值将被設定為Article的title 字段。

​​https://blog.51cto.com/wiwili/1965648​​

是以,此注解允許開發人員通過請求來持久化一個對象。沒有它,Spring認為必須建立一個新對象。另外,它直接顯示一個對象模型來檢視。你不需要在方法中再調用model.setAttribute()。在視圖部分,可以通過注解中的指定值查找指定對象(例如,@ModelAttribute(“articleView”)可以在jsp中通過&{articleView}擷取相應的值)或對象的類名稱(例如@ModelAttribute()Article article将在視圖層擷取方式就是${article})。

二、@ModelAttribute注解相關代碼詳解

@ModelAttribute注解的方法是作用于整個Controller的,實際上在執行Controller的每個請求時都會執行@ModelAttribute注解的方法。

執行過程在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter中檢視,每次執行Controller時都會執行@ModelAttribute注解的方法:

modelFactory.initModel(webRequest, mavContainer, invocableMethod)中會執行@ModelAttribute注解的方法(org.springframework.web.method.annotation.ModelFactory中可檢視):

在private void invokeModelAttributeMethods(NativeWebRequest request, ModelAndViewContainer container)中會判斷方法上是否被@ModelAttribute注解,如果是則會執行這個方法,并将傳回值放到container中:

我們進入org.springframework.web.method.support.InvocableHandlerMethod 的invokeForRequest方法,在給定request請求的上下文中解析其參數值後調用該方法,參數值通常通過 HandlerMethodArgumentResolver來解析。

org.springframework.web.method.support.HandlerMethodArgumentResolverComposite

回到org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,可以看到:

​​http://blog.csdn.net/hejingyuan6/article/details/49995987​​

當@ModelAttribute注解方法時,這個方法在每次通路Controller時都會被執行,其執行到的原理就是在每次執行Controller時都會判斷一次,并執行@ModelAttribute的方法,将執行後的結果值放到container中.

轉載:

​​芋道源碼​​