zoukankan      html  css  js  c++  java
  • Spring MVC之HandlerMap 初始化(RequestmappingHandlerMapping)

        AbstractHandlerMethodMapping类实现了InitializingBean接口,在属性初始化完成后会调用afterPropertiesSet()方法,在该方法中调用initHandlerMethods();进行HandlerMethod初始化。

       

    /**
    	 * 扫描ApplicationContext中的Bean,查找并注册 handlerMethod
    	 */
    	protected void initHandlerMethods() {
    		if (logger.isDebugEnabled()) {
    			logger.debug("Looking for request mappings in application context: " + getApplicationContext());
    		}
    		//从ApplicationContext中获取所有Bean名称
    		String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ?
    				BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
    				getApplicationContext().getBeanNamesForType(Object.class));
    		//遍历Bean
    		for (String name : beanNames) {
    			if (!name.startsWith(SCOPED_TARGET_NAME_PREFIX) && isHandler(getApplicationContext().getType(name))) {
    				//从bean中查找handler method
    				detectHandlerMethods(name);
    			}
    		}
    		//handler method 初始化
    		handlerMethodsInitialized(getHandlerMethods());
    	}
    /**
    	 * 从一个Handler中查找 handler method
    	 */
    	protected void detectHandlerMethods(final Object handler) {
    		Class<?> handlerType =
    				(handler instanceof String ? getApplicationContext().getType((String) handler) : handler.getClass());
    
    		
    		final Map<Method, T> mappings = new IdentityHashMap<Method, T>();
    		//获取Class
    		final Class<?> userType = ClassUtils.getUserClass(handlerType);
    
    		Set<Method> methods = HandlerMethodSelector.selectMethods(userType, new MethodFilter() {
    			@Override
    			public boolean matches(Method method) {
    				T mapping = getMappingForMethod(method, userType);
    				if (mapping != null) {
    					mappings.put(method, mapping);
    					return true;
    				}
    				else {
    					return false;
    				}
    			}
    		});
    		//遍历所有handler method,并注册
    		for (Method method : methods) {
    			registerHandlerMethod(handler, method, mappings.get(method));
    		}
    	}

     isHandler 在RequestMappingHandlerMapping 具体实现

    	/**
    	 * {@inheritDoc}
    	 * Expects a handler to have a type-level @{@link Controller} annotation.
    	 */
    	@Override
    	protected boolean isHandler(Class<?> beanType) {
    		return ((AnnotationUtils.findAnnotation(beanType, Controller.class) != null) ||
    				(AnnotationUtils.findAnnotation(beanType, RequestMapping.class) != null));
    	}
  • 相关阅读:
    php中防止SQL注入的方法
    谈谈asp,php,jsp的优缺点
    SSH原理与运用(一):远程登录
    优化MYSQL数据库的方法
    json_encode和json_decode区别
    静态方法与非静态方法的区别
    Java 异常的Exception e中的egetMessage()和toString()方法的区别
    $GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别
    HTML5开发,背后的事情你知道吗?
    使用C语言来实现模块化
  • 原文地址:https://www.cnblogs.com/wei-zw/p/8797735.html
Copyright © 2011-2022 走看看