HandlerAdapters 를 돌면서 적합한 HandlerAdapter를 찾는다
public final boolean supports(Object handler) {
boolean var10000;
if (handler instanceof HandlerMethod handlerMethod) {
if (this.supportsInternal(handlerMethod)) {
var10000 = true;
return var10000;
}
}
var10000 = false;
return var10000;
}

RequestHandlerMapping 일때 RequestMappingHandlerAdaptor가 선택된다
이제부터 HandlerAdaptor를 ha로 부르겠다
ha에서 handle 메소드를 호출한다
그러면 RequestMappingHandlerAdaptor 클래스의 handleInternal 메소드가 실행된다
invokeHandlerMethod 메소드가 실행되고
ServletInvocableHandlerMethod 클래스의 invokeAndHandle 메소드를 실행한다
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
Object returnValue = this.invokeForRequest(webRequest, mavContainer, providedArgs); // 요청을 실행
메소드의 Argument를 구한다 그러면 인자들을 넣고 doInvoke()로 handler 메소드를 실행한다
@Nullable
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
Object[] args = this.getMethodArgumentValues(request, mavContainer, providedArgs);
if (logger.isTraceEnabled()) {
logger.trace("Arguments: " + Arrays.toString(args));
}
if (this.shouldValidateArguments() && this.methodValidator != null) {
this.methodValidator.applyArgumentValidation(this.getBean(), this.getBridgedMethod(), this.getMethodParameters(), args, this.validationGroups);
}
Object returnValue = this.doInvoke(args);
if (this.shouldValidateReturnValue() && this.methodValidator != null) {
this.methodValidator.applyReturnValueValidation(this.getBean(), this.getBridgedMethod(), this.getReturnType(), returnValue, this.validationGroups);
}
return returnValue;
}
protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
MethodParameter[] parameters = this.getMethodParameters();
if (ObjectUtils.isEmpty(parameters)) {
return EMPTY_ARGS;
} else {
Object[] args = new Object[parameters.length];
for(int i = 0; i < parameters.length; ++i) {
MethodParameter parameter = parameters[i];
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
args[i] = findProvidedArgument(parameter, providedArgs);
if (args[i] == null) {
if (!this.resolvers.supportsParameter(parameter)) {
throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
}
try {
args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
} catch (Exception var10) {
if (logger.isDebugEnabled()) {
String exMsg = var10.getMessage();
if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {
logger.debug(formatArgumentError(parameter, exMsg));
}
}
throw var10;
}
}
}
return args;
}
}
resolvers 는 대략 27개 있는데 이것을 가지고 각각에 맞는 바인딩된 값을 구한다
다시 invokeForRequest 메소드 보면
Object returnValue = this.doInvoke(args);
doInvoke 해서 결과를 리턴한다
여기까지 타면
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception {
Object returnValue = this.invokeForRequest(webRequest, mavContainer, providedArgs);
이렇게 결과를 받는다
그리고 반환 관련 작업처리
this.returnValueHandlers.handleReturnValue(returnValue, this.getReturnValueType(returnValue), mavContainer, webRequest);