SpringMVC源码解析一:HandlerMapping初始化

initHandlerMappings()方法初始化有两种方式:

1.setApplicationContext()

2.afterPropertiesSet()

 

1.setApplicationContext()实现方式如下:

首先进入DispatcherServlet  类中,可以看到DispatcherServlet  的继承关系:

DispatcherServlet  extends FrameworkServlet  
FrameworkServlet extends HttpServletBean implements ApplicationContextAware
ApplicationContextAware中只有:

   void setApplicationContext(ApplicationContext applicationContext) throws BeansException;

    此方法setApplicationContext实现类在 ApplicationObjectSupport中:

    ApplicationObjectSupport implements ApplicationContextAware

public final void setApplicationContext(@Nullable ApplicationContext context) throws BeansException {
		if (context == null && !isContextRequired()) {
			// Reset internal context state.
			this.applicationContext = null;
			this.messageSourceAccessor = null;
		}
		else if (this.applicationContext == null) {
			// Initialize with passed-in context.
			if (!requiredContextClass().isInstance(context)) {
				throw new ApplicationContextException(
						"Invalid application context: needs to be of type [" + requiredContextClass().getName() + "]");
			}
			this.applicationContext = context;
			this.messageSourceAccessor = new MessageSourceAccessor(context);
			initApplicationContext(context);
		}
		else {
			// Ignore reinitialization if same context passed in.
			if (this.applicationContext != context) {
				throw new ApplicationContextException(
						"Cannot reinitialize with different application context: current one is [" +
						this.applicationContext + "], passed-in one is [" + context + "]");
			}
		}
	}

    //initApplicationContext(context);
    protected void initApplicationContext(ApplicationContext context) throws BeansException {
		initApplicationContext();
	}
	
    protected void initApplicationContext() throws BeansException {
	}


 initApplicationContext()方法由子类实现:

AbstractDetectingUrlHandlerMapping

SimpleUrlHandlerMapping 

 

  1. AbstractDetectingUrlHandlerMapping实现:
public void initApplicationContext() throws ApplicationContextException {
		//将匹配该映射器的Handler对象加入到this.HandlerMapping
		super.initApplicationContext();
		detectHandlers();
	}

        super.initApplicationContext();实现如下:

 //super.initApplicationContext();实现在AbstractHandlerMapping类中:
 //AbstractHandlerMapping extends WebApplicationObjectSupport implements HandlerMapping, Ordered

    //拦截器一些设置
	protected void initApplicationContext() throws BeansException {
		extendInterceptors(this.interceptors);
		//探测ApplicationContext中已经解析过的MappedInterceptor
		detectMappedInterceptors(this.adaptedInterceptors);
		//初始化拦截器
		initInterceptors();
	}

 //initInterceptors();
	protected void initInterceptors() {
		if (!this.interceptors.isEmpty()) {
			for (int i = 0; i < this.interceptors.size(); i++) {
				Object interceptor = this.interceptors.get(i);
				if (interceptor == null) {
					throw new IllegalArgumentException("Entry number " + i + " in interceptors array is null");
				}
				this.adaptedInterceptors.add(adaptInterceptor(interceptor));
			}
		}
	}

detectHandlers();实现如下:

protected void detectHandlers() throws BeansException {
		ApplicationContext applicationContext = obt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值