我正在使用My First SpringMVC应用程序.....(3.0.2.RELEASE)
我注意到AnnotationMethodHandlerAdapter调用了ServletHandlerMethodResolver的构造函数,这个构造函数调用了HandlerMethodResolver的init()方法。
public void init(Class<?> handlerType) {
Class<?>[] handlerTypes =
Proxy.isProxyClass(handlerType) ? handlerType.getInterfaces() : new Class<?>[] {handlerType};
for (final Class<?> currentHandlerType : handlerTypes) {
ReflectionUtils.doWithMethods(currentHandlerType, new ReflectionUtils.MethodCallback() {
public void doWith(Method method) {
Method specificMethod = ClassUtils.getMostSpecificMethod(method, currentHandlerType);
if (isHandlerMethod(method)) {
handlerMethods.add(specificMethod);
}
else if (method.isAnnotationPresent(InitBinder.class)) {
initBinderMethods.add(specificMethod);
}
else if (method.isAnnotationPresent(ModelAttribute.class)) {
modelAttributeMethods.add(specificMethod);
}
}
}, ReflectionUtils.NON_BRIDGED_METHODS);
}
注意:在我的例子中,Proxy.isProxyClass(handlerType)返回false。
这个init()方法(在ReflectionUtils.doWithMethods()的帮助下)找到了关于方法的@RequestMapping,@ InitBinder和@ModelAttribute注释。 - 指定的类AND - 所有SuperClasses 包括Object Class !!!
我们不应该(也不能)在Object类的方法上“放置”这样的注释。那么,为什么init()会扫描Object类的方法呢?请澄清!
答案 0 :(得分:0)
尝试扩展常用功能,您将看到原因。
@Controller
public class IndexController extends CommonFuncionality {
// impl goes here
}
CommonFuncionality包含Spring-MVC内容,如@ InitBinder,@ ModeAttribute等等......