說說@ModelAttribute在父類和子類中的執行順序
@ModelAttribute在父類、子類的執行順序
被 @ModelAttribute 註解的方法會在Controller每個方法執行之前都執行,因此對於一個Controller中包含多個URL的時候,要謹慎使用。
執行順序:
先執行子類 @ModelAttribute 註解的方法,再執行父類中 @ModelAttribute 註解的方法。
@ModelAttribute原理概述以及使用註意點
@ModelAttribute註解修飾的方法:
1.從數據庫中取出對象,把對象放到Map中,鍵為user
2.SpringMvc從Map中取出User對象,並且把請求參數賦值給User對象的對應屬性
3.SpringMvc把上述的對象傳入目標方法的參數
註意:在@ModelAttribute修飾的方法中,放入到Map中的鍵名要和目標方法入參類型的第一個字母小寫的字符串一致
源碼分析流程:
調用@ModelAttribute註解修飾的方法,實際上@ModelAttribute方法中Map中的數據放在瞭implicitModel中.
解析請求處理器的目標參數,實際上該目標參數來自於WebDataBinder對象的target屬性
1).創建WebDataBinder對象
確定objectName屬性:如果傳入的attrName屬性值為””,則objectName為類名第一個字母小寫
註意:attrName若目標方法的POJO屬性使用瞭@ModelAttribute來修飾,則attrName的值為@ModelAttribute的value屬性
確定target屬性
在implitModel中查找attrName對應的屬性值.若不存在,則驗證當前handler是否使用瞭@sessionAttribute進行修飾,則嘗試從session中獲取attrName所對應的屬性值,若session中沒有,則拋出瞭異常。
若Handler沒有使用@sessionAttribute進行修飾,或者@SessionAttrbutes中沒有value值指定的key和attrName相,則通過反射創建POJO對象.
2).SpringMvc把表單的請求參數賦給瞭WebDataBinder的target對應的屬性,
3).SpringMvc會把WebDataBinder的attrName和targe給到implicitMoel
4).把WebDataBinder的target作為參數傳遞給目標方法的入參
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Spring的@RequestParam對象綁定方式
- SpringBoot @ModelAttribute使用場景分析
- SpringMVC執行步驟、Model的使用詳解
- SpringMVC處理數據輸出的實例代碼
- 淺析SpringMVC中的適配器HandlerAdapter