天天看點

spring ModelAttribute屬性解析

ModelAttribute這個屬性的解析主要是在 RequestMappingHandlerAdapter.java裡做的

這個屬性的解析主要有兩次.

第一次:在RequestMappingHandlerAdapter這個類被初始化的時候,由于該類繼續InitializingBean接口.使用在使用getBean生成該對象時候,會調用.afterPropertiesSet

spring ModelAttribute屬性解析

afterPropertiesSet函數看其第一行的接口調用.這個接口是解析ModelAttribute屬性的

這個解析過程大體說下

1.首先從context中擷取所有的類

2,在所有類中查找是ControllerAdvice.class 注解的類

3.有滿足條件的類的情況下,周遊所有類,看其裡面是否有ModelAttribute注解的方法.如果有則把這個method存放到 Map中

這裡是第一次解析

第二次解析是在擷取ModelAndView的時候

大體過程如下,根據request擷取HandlerMethod.然後如下圖

spring ModelAttribute屬性解析

這個invokeHandlerMethod接口的調用是第二次解析這個注解的地方.看實作

spring ModelAttribute屬性解析

如圖高亮處.首先在第一個高亮處解析擷取這個注解的方法.過程如下.

1.根據handlerMethod這個方法,擷取其所在的類

2.周遊這個類的所有方法,找到所有是ModelAttribute注解且不是RequestMapping注解的方法,然後把所有方法存放到map中.最後指派給modelFactory變量

第二高亮,initModel的調用就是這個注解方法的反射調用的地方了,看代碼實作 

spring ModelAttribute屬性解析
spring ModelAttribute屬性解析

上圖的代碼很明白了.大體說下過程

1.首先判斷注解方法是不是空

2.如果不是則從頭部取一個方法下來

3.使用反射調用這個方法

4.如果這個方法傳回不是void類型的,則把這個傳回值加入到container中去

基本就是這樣一個過程了.如有問題敬請指出