前面博客中springmvc学习一初始化源码
记录了handlerMapping在初始化的时候,会解析当前bean中url和handlerMethod的映射关系,但是有一个点忽略了,那就是handlerMapping和handlerAdapter自身是在什么被初始化的
@EnableWebMvc
这个注解是Java快捷配置mvc的,在使用该注解之后,再添加一个WebMvcConfigurerAdapter的实现类,即可
@EnableWebMvc会通过@Import注入一个bean:DelegatingWebMvcConfiguration
DelegatingWebMvcConfiguration是WebMvcConfigurationSupport 的子类
在WebMvcConfigurationSupport类中,通过@Bean的形式,把RequestMappingHandlerAdapter、SimpleControllerHandlerAdapter、HttpRequestHandlerAdapter、RequestMappingHandlerMapping、BeanNameUrlHandlerMapping 这五个bean注入到了spring容器中
在springmvc项目中,如果我们不使用@EnableWebMvc注解,那就需要自己去继承WebMvcConfigurationSupport,然后把自己实现的类,注入到spring容器中,原理都是一样的,无非就是一个是spring帮我们实现好的,一个是我们自己去实现
handlerAdapter
前面的博客中,也有说过,springmvc中,声明一个controller有三种方法,分别是:
1、@Controller注解
2、实现org.springframework.web.servlet.mvc.Controller接口
3、实现org.springframework.web.HttpRequestHandler接口
对于前一种,是我们经常使用的,是有RequestMappingHandlerMapping和RequestMappingHandlerAdapter来处理的
第二种是由BeanNameUrlHandlerMapping和SimpleControllerHandlerAdapter来解析的
第三种是由BeanNameUrlHandlerMapping和HttpRequestHandlerAdapter 来解析的
handlerAdapter中没有太多需要关注的逻辑,在handlerMapping中,在初始化阶段反而是比较重要的
RequestMappingHandlerMapping
这个handlerMapping在其afterProperties方法中,会对所有的controller进行解析,将url 和method的映射关系存到底层的map集合中
BeanNameUrlHandlerMapping
这个bean是ApplicationContextAware接口的实现类,所以,在org.springframework.context.support.ApplicationContextAwareProcessor#postProcessBeforeInitialization这个后置处理器方法执行的时候,会调用applicationContextAware实现类的setApplicationContext方法,也就是在这个方法中,beanNameUrlHandlerMapping完成对controller的解析的