springmvc parameter parsing binding principle

 handlerMethodArgumentResolver : method parameters parser interface, which is bound springmvc argument parsing core interface. Different types of binding parameters are achieved by implementing this interface. This interface may be derived from parameters defined by the parser implemented. This interface has the following two methods:

public  interface HandlerMethodArgumentResolver { 

   // the parameter parser parses parameter supports          
   Boolean supportsParameter (MethodParameter parameter);               

  // the request from the given method parameters (WebRequest) resolves to parameter values and returns 
   Object resolveArgument (MethodParameter parameter, 
                    ModelAndViewContainer mavContainer, 
                    NativeWebRequest WebRequest, 
                   WebDataBinderFactory binderFactory) throws Exceptions and; 

}                

 

initialization

The method of initialization parameters related method afterProperitesSet RequestMappingHandlerAdapter.java parser class, code is as follows:

public  void afterPropertiesSet () {
     IF ( the this .argumentResolvers == null ) {
        // initialization parameter parser springmvc default methods, and added to argumentResolvers (HandlerMethodArgumentResolverComposite) 
      List <HandlerMethodArgumentResolver> = Resolvers. getDefaultArgumentResolvers ():
       the this .argumentResolvers = new new HandlerMethodArgumentResolverComposite () .addResolvers (Resolvers.);           

     } 
     IF ( the this .initBinderArgumentResolvers == null ) {
          //Springmvc initialization default initialization binder (@InitBinder) parameter decoder and added to initBinderArgumentResolvers (HandlerMethosArgumentResolverComposite) 
        List <HandlerMethosArgumentResolver> = Resolvers. GetDefaultInitBinderArgumentResolvers ();
         the this .initBinderArgumentResolvers = new new HandlerMethodArgumentResolverComposite () addResolvers (Resolvers.);.    
    } 
    IF ( the this .returnValueHandlers == null ) {
          // get the default value resolver method returns 
       List <HandlerMethodreturnValueHandler> Handler = getDefaultReturnValueHandlers ();
        the this .returnValueHandlers = new new HandlerMethodReturnValueHandlerComposite().addHandlers(handlers);
    } 
    initControllerAdviceCache();
}

 

Now we are entering getDefaultArgumentResolvers method, as follows

// default parameters resolve to create a default parameter parser 24, and added to the Resolvers.
 // Here are 24 parameters parser for different types of parameters to resolve the 
Private List <HandlerMethodArgumentResolver> getDefaultArgumentResolvers () { 
    List <HandlerMethodArgumentResolver> resolvers. = new new the ArrayList <HandlerMethodArgumentResolver> (); 

    // parameter based annotation parser 

    // generally used for simple binding parameters with @RequestParam annotation, such as a simple parameter byte, int, long, double, String and corresponding to the type of packaging 
    resolvers.add ( new new RequestParamMethodArgumentResolver (the getBeanFactory (), to false ;))
     // parse @RequestParam binding with annotations for processing, and the parameter type of Map 
    resolvers.add ( new newRequestParamMapMethodArgumentResolver ());
     // typically with default parameters for processing annotation @PathVariable binding 
    resolvers.add ( new new PathVariableMethodArgumentResolver ());
     // also related parameters for Map @PathVariable annotated with binding, but also the subsequent there are some default parameter parser. There are some follow-up parameters parser, I do not explain everything up here. Want to confirm a specific parameter will pay a parameter which the parser can be learned by the parser supportsParameter (MethodParameter parameter) method 
    resolvers.add ( new new PathVariableMapMethodArgumentResolver ()); 
    resolvers.add ( new new MatrixVariableMethodArgumentResolver ()); 
    Resolvers. .add ( new new MatrixVariableMapMethodArgumentResolver ()); 
    resolvers.add ( new new ServletModelAttributeMethodProcessor ( to false )); 
    resolvers.add (new RequestResponseBodyMethodProcessor(getMessageConverters()));
    resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters()));
    resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new RequestHeaderMapMethodArgumentResolver());
    resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));
    resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));

    // 基于类型的参数解析器
    resolvers.add(new ServletRequestMethodArgumentResolver());
    resolvers.add(new ServletResponseMethodArgumentResolver());
    resolvers.add(new HttpEntityMethodProcessor(getMessageConverters()));
    resolvers.add(new RedirectAttributesMethodArgumentResolver());
    resolvers.add(new ModelMethodProcessor());
    resolvers.add(new MapMethodProcessor());
    resolvers.add(new ErrorsMethodArgumentResolver());
    resolvers.add(new SessionStatusMethodArgumentResolver());
    resolvers.add(new UriComponentsBuilderMethodArgumentResolver());

    // Custom arguments
    if (getCustomArgumentResolvers() != null) {
        resolvers.addAll(getCustomArgumentResolvers());
    }

 

Add to HandlerMethodArgumentResolverComposite this parameter parser class, which is to achieve a HandlerMethodArgumentResolver interface. Here the use of composite mode design patterns (combination mode), in springmvc, the parameter parse all requests are entered HandlerMethodArgumentResolverComposite class implemented. It has two member variables, as follows

 

//它的元素在RequestMappingHandlerAdapter类的afterPropertiesSet方法中被添加,存放的是springmvc默认的一些HandlerMethodArgumentResolver参数解析器
private final List<HandlerMethodArgumentResolver> argumentResolvers = new LinkedList<HandlerMethodArgument>Resolver();
//存放已经解析过的参数,已经对应的HandlerMethodAgrumentResolver解析器,加快查找过程
private final Map<MethodParameter,HandlerMethodArgumentResolver> argumentResolverCache = new ConcurrentHashMap<MethodParameter,HandlerMethodArgumentResolver>(256);

 

 

 

 

 

 

 

 

 

 

参考资料:https://www.cnblogs.com/w-y-c-m/p/8443892.html

Guess you like

Origin www.cnblogs.com/javadongx/p/11568571.html