說說@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。

推薦閱讀: