SpringMVC源码(未完工)

1、RequestMappingHandlerMapping实现了InitializingBean接口,会在实例化之后,调用(父类的)initHandlerMethods方法,遍历beanname,看看是不是handler,把handler中的每一个method都装配成一个HandlerMethod,放到mappingRegistry中。

2、DispatchSevlet的doDispatch会调用RequestMappingHandlerAdaptor的handle方法,内部逻辑就是把上面mappingRegistry中的HandlerMethod取出来,解析方法参数,执行,再处理返回结果。RequestMappingHandlerAdaptor之所以叫adaptor,其实就是适配RequestMappingHandlerMapping,单独的RequestMappingHandlerMapping只能执行方法。刚才说的参数解析处理返回结果这些附属方法,要在RequestMappingHandlerAdaptor中做,RequestMappingHandlerAdaptor中有argumentResolvers、returnValueHandlers、parameterNameDiscoverer 这些属性。【parameterNameDiscoverer之所以能读取方法参数名,是因为class文件的方法表中,指向的属性表里面的localVariableTable保存了参数名的信息】

3、springmvc拦截器的原理:在WebMvcAutoConfiguration中,会将RequestMappingHandlerMapping注册,在注册过程中,父类WebMvcConfigurationSupport的258行,new一个registry,把spring工厂中所有WebMvcConfigurer类型的addInterceptors都调用一下(registry是方法的参数),把所有拦截器都收集到registry中,赋值给RequestMappingHandlerMapping的属性。

4、MessageConverters,用的是WebMvcConfigurer接口的是WebMvcAutoConfiguration的另一个内部类WebMvcAutoConfigurationAdapter,里面涉及到cglib动态代理。

原文地址:https://www.cnblogs.com/chuliang/p/9724513.html