1 finishBeanFactoryInitialization->preInstantiateSingletons 2 3 在preInstantiateSingletons的getBean()的方法中会实例化带有@RequestMapping、@Controller、@RestController的bean, 4 detectHandlerMethods 5 6 protected void detectHandlerMethods(Object handler) { 7 Class<?> handlerType = (handler instanceof String ? 8 obtainApplicationContext().getType((String) handler) : handler.getClass()); 9 10 if (handlerType != null) { 11 Class<?> userType = ClassUtils.getUserClass(handlerType); 12 Map<Method, T> methods = MethodIntrospector.selectMethods(userType, 13 (MethodIntrospector.MetadataLookup<T>) method -> { 14 try { 15 return getMappingForMethod(method, userType); 16 } 17 catch (Throwable ex) { 18 throw new IllegalStateException("Invalid mapping on handler class [" + 19 userType.getName() + "]: " + method, ex); 20 } 21 }); 22 if (logger.isTraceEnabled()) { 23 logger.trace(formatMappings(userType, methods)); 24 } 25 //循环遍历controller类中的接口方法,会把接口的URL作为key,接口的具体方法等信息作为value存入一个map中 26 //private final Map<T, MappingRegistration<T>> registry = new HashMap<>(); 27 28 methods.forEach((method, mapping) -> { 29 Method invocableMethod = AopUtils.selectInvocableMethod(method, userType); 30 registerHandlerMethod(handler, invocableMethod, mapping); 31 }); 32 } 33 }