面试题:当接口定义的是下面这种方式的时候是用什么调用的?为什么?如何调用的?
@Controller
public class UserController {
@RequestMapping("/getUser")
public Object getUser(String name){
System.out.println("getuser");
return "success";
}
}
我们试想一下,一个类调用另一个类有几种方法,一是通过new一个类,再去调用,但是在DispatcherServlet里new一个类不现实,因为它根本不知道你定义的类名;二是通过继承一个类然后实现它,也就是上面所讲的,但它是有弊端的,一个类只能写一个接口,有多少个接口就有多少个类,那么剩下的就只能是反射了
直接到doDispatch方法中
org.springframework.web.servlet.DispatcherServlet#doDispatch
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
try {
ModelAndView mv = null;
Object dispatchException = null;
try {
processedRequest = this.checkMultipart(request);
multipartRequestParsed = processedRequest != request;
//获取映射器,这里获取的是RequestMappingHandlerMapping
mappedHandler = this.getHandler(processedRequest);
if (mappedHandler == null) {
this.noHandlerFound(processedRequest, response);
return;
}
//同样的,适配器也变成RequestMappingHandlerAdapter
HandlerAdapter ha = this.getHandlerAdapter(mappedHandler.getHandler());
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if ((new ServletWebRequest(request, response)).checkNotModified(lastModified) && isGet
{
return