SpringMvc中的RequestMappingHandlerAdapter初始化源码阅读

xiaoxiao2021-02-28  45

RequestMappingHandlerAdapter中有大量的属性用于对于Request的解析属性,它通俗的讲就是对请求参数和返回值进行解析,当然它也只是一个适配器,具体的实现在由它的一些属性决定。

RootBeanDefinition handlerAdapterDef = new RootBeanDefinition(RequestMappingHandlerAdapter.class); handlerAdapterDef.setSource(source); handlerAdapterDef.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); handlerAdapterDef.getPropertyValues().add("contentNegotiationManager", contentNegotiationManager); handlerAdapterDef.getPropertyValues().add("webBindingInitializer", bindingDef); handlerAdapterDef.getPropertyValues().add("messageConverters", messageConverters); if (element.hasAttribute("ignoreDefaultModelOnRedirect")) { Boolean ignoreDefaultModel = Boolean.valueOf(element.getAttribute("ignoreDefaultModelOnRedirect")); handlerAdapterDef.getPropertyValues().add("ignoreDefaultModelOnRedirect", ignoreDefaultModel); } if (argumentResolvers != null) { handlerAdapterDef.getPropertyValues().add("customArgumentResolvers", argumentResolvers); } if (returnValueHandlers != null) { handlerAdapterDef.getPropertyValues().add("customReturnValueHandlers", returnValueHandlers); } if (asyncTimeout != null) { handlerAdapterDef.getPropertyValues().add("asyncRequestTimeout", asyncTimeout); } if (asyncExecutor != null) { handlerAdapterDef.getPropertyValues().add("taskExecutor", asyncExecutor); } handlerAdapterDef.getPropertyValues().add("callableInterceptors", callableInterceptors); handlerAdapterDef.getPropertyValues().add("deferredResultInterceptors", deferredResultInterceptors); String handlerAdapterName = parserContext.getReaderContext().registerWithGeneratedName(handlerAdapterDef);

有两个解析器,一个叫ArgumentResolver,一个叫ReturnValueHandler.它也是实现了InitializingBean接口,所以实例化后会调用afterPropertiesSet方法。

在对RequestMappingHandlerAdapter进行定义时,有事先根据配置设置它的一些属性值,所以根据判定是否需要设置默认的值。见名知意,不做什么解释。。。

public void afterPropertiesSet() { if (this.argumentResolvers == null) {//argumentResolvers 为空则获取默认的argumentResolvers List<HandlerMethodArgumentResolver> resolvers = getDefaultArgumentResolvers(); this.argumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); } if (this.initBinderArgumentResolvers == null) {//如果initBinderArgumentResolver为空,则获得默认的值 List<HandlerMethodArgumentResolver> resolvers = getDefaultInitBinderArgumentResolvers(); this.initBinderArgumentResolvers = new HandlerMethodArgumentResolverComposite().addResolvers(resolvers); } if (this.returnValueHandlers == null) {//如果returnValueHandlers为空,则获取默认的值 List<HandlerMethodReturnValueHandler> handlers = getDefaultReturnValueHandlers(); this.returnValueHandlers = new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers); } initControllerAdviceCache(); }设置完之后则注入到Spring的容器中,在Servlet初始化时会去获取其中的bean,然后设置到servlet的属性当中,供处理请求时使用。
转载请注明原文地址: https://www.6miu.com/read-2623254.html

最新回复(0)