ModelAttribute這個屬性的解析主要是在 RequestMappingHandlerAdapter.java裡做的
這個屬性的解析主要有兩次.
第一次:在RequestMappingHandlerAdapter這個類被初始化的時候,由于該類繼續InitializingBean接口.使用在使用getBean生成該對象時候,會調用.afterPropertiesSet
afterPropertiesSet函數看其第一行的接口調用.這個接口是解析ModelAttribute屬性的
這個解析過程大體說下
1.首先從context中擷取所有的類
2,在所有類中查找是ControllerAdvice.class 注解的類
3.有滿足條件的類的情況下,周遊所有類,看其裡面是否有ModelAttribute注解的方法.如果有則把這個method存放到 Map中
這裡是第一次解析
第二次解析是在擷取ModelAndView的時候
大體過程如下,根據request擷取HandlerMethod.然後如下圖
這個invokeHandlerMethod接口的調用是第二次解析這個注解的地方.看實作
如圖高亮處.首先在第一個高亮處解析擷取這個注解的方法.過程如下.
1.根據handlerMethod這個方法,擷取其所在的類
2.周遊這個類的所有方法,找到所有是ModelAttribute注解且不是RequestMapping注解的方法,然後把所有方法存放到map中.最後指派給modelFactory變量
第二高亮,initModel的調用就是這個注解方法的反射調用的地方了,看代碼實作
上圖的代碼很明白了.大體說下過程
1.首先判斷注解方法是不是空
2.如果不是則從頭部取一個方法下來
3.使用反射調用這個方法
4.如果這個方法傳回不是void類型的,則把這個傳回值加入到container中去
基本就是這樣一個過程了.如有問題敬請指出