为什么(Spring 3)HandlerMethodResolver #init()方法在Object类的方法上找到注释?

时间:2010-06-10 11:10:21

标签: spring-mvc

我正在使用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类的方法呢?请澄清!

Back Link

  • SE

1 个答案:

答案 0 :(得分:0)

尝试扩展常用功能,您将看到原因。

@Controller
public class IndexController extends CommonFuncionality {

    // impl goes here

}

CommonFuncionality包含Spring-MVC内容,如@ InitBinder,@ ModeAttribute等等......