代码之家  ›  专栏  ›  技术社区  ›  dira

为什么(Spring3)HandlerMethodResolver#init()方法在对象类的方法上查找注释?

  •  1
  • dira  · 技术社区  · 14 年前

    我在玩我的第一个基于SpringMVC的应用程序。。。。。(3.0.2.发布)

    我注意到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);
        }
    

    这个init()方法(借助ReflectionUtils.doWithMethods())在 -指定类别和 -所有的超类 !!!

    我们不应该(也不能)在对象类的方法上“放置”这样的注释。那么,为什么init()扫描对象类的方法呢?请澄清!

    Back Link

    • 东南方
    1 回复  |  直到 14 年前
        1
  •  0
  •   Arthur Ronald    14 年前

    尝试扩展公共函数,你就会知道为什么。

    @Controller
    public class IndexController extends CommonFuncionality {
    
        // impl goes here
    
    }