Parameter Binding Sources
When processing controller requests, Spring MVC must bind values to method parameters from multiple sources:
- Request parameters (URL query strings, request body, headers)
- Cookies
- Session attributes
- Flash attributes (for redirect scenarios)
- Session attributes declared via @SessionAttribute
- Attributes set by @ModelAttribute methods
Binding Implementation
Parameter resolution is handled by HandlerMethodArgumentResolver implementations. The framework uses a composite resolvre that sequentially attempts each resolver until one handles the parameter type. This mechanism also applies to @ModelAttribute and @InitBinder methods.
RequestMappingHandlerAdapter Initialization
The adapter initializes three key components during setup:
- Arguement resolvers for handler methods
- Init binder resolvers for @InitBinder methods
- Return value handlers
Here's the initialization process for argument resolvers:
private List<HandlerMethodArgumentResolver> createDefaultResolvers() {
List<HandlerMethodArgumentResolver> resolverComponents = new ArrayList<>();
// Annotation-based resolvers
resolverComponents.add(new RequestParamResolver(beanFactory, false));
resolverComponents.add(new RequestParamMapResolver());
resolverComponents.add(new PathVariableResolver());
resolverComponents.add(new PathVariableMapResolver());
resolverComponents.add(new MatrixVariableResolver());
resolverComponents.add(new MatrixVariableMapResolver());
resolverComponents.add(new ServletModelResolver(false));
resolverComponents.add(new RequestBodyProcessor(messageConverters, requestAdvice));
// Type-based resolvers
resolverComponents.add(new ServletRequestResolver());
resolverComponents.add(new ServletResponseResolver());
resolverComponents.add(new HttpEntityProcessor(messageConverters, requestAdvice));
resolverComponents.add(new RedirectAttributesResolver());
resolverComponents.add(new ModelProcessor());
// Catch-all handlers
resolverComponents.add(new RequestParamResolver(beanFactory, true));
resolverComponents.add(new ServletModelResolver(true));
return resolverComponents;
}
Request Processing Flow
When handling a request, the adapter:
- Creates a
ServletInvocableHandlerMethodinstance - Configrues parameter resolvers and return handlers
- Processes @ModelAttribute and @InitBinder methods
- Resolves method parameters via the resolver chain
- Invokes the controller method
- Processes the return value
Parameter resolution occurs through the composite resolver's supportsParameter and resolveArgument methods. The resolver cache optimizes repeated parameter handling:
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer container,
NativeWebRequest request,
DataBinderFactory binderFactory) {
HandlerMethodArgumentResolver resolver = getResolver(parameter);
return resolver.resolveArgument(parameter, container, request, binderFactory);
}
private HandlerMethodArgumentResolver getResolver(MethodParameter parameter) {
HandlerMethodArgumentResolver resolver = resolverCache.get(parameter);
if (resolver == null) {
for (HandlerMethodArgumentResolver candidate : argumentResolvers) {
if (candidate.supportsParameter(parameter)) {
resolver = candidate;
resolverCache.put(parameter, resolver);
break;
}
}
}
return resolver;
}