一.springMVC中提供注解@EnableWebMvc
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)//注解主要目的是导入DelegatingWebMvcConfiguration
public @interface EnableWebMvc {
}
二.springboot(最大特点是自动装配,实现原理是@EnableAutoConfiguration,前面文章已经介绍过)
1.@EnableAutoConfiguratio+引入依赖spring-boot-starter-web包
2.spring-boot-autoconfigure项目的文件spring.factories中找到,自动装配类org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)//一旦容器中有WebMvcConfigurationSupport对象,将不再自动装配
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}
三.主要类分析
1.WebMvcConfigurationSupport相当于总的spring-web.xml,配置web组件,如消息转化、拦截器、视图转化器、跨域配置、资源控制器等;需要扩展的功能用预留空方法来实现,让子类继承重写
2.WebMvcConfigurer(主要是扩展WebMvcConfigurationSupport类,封装了WebMvcConfigurationSupport预留的所有空方法,利用回调的方式来丰富WebMvcConfigurationSupport组件,相当于往(spring-web.xml)里面再增加配置)
@Autowired(required = false)//自定义实现接口的配置会被收集到list中注入到组合配置中,所以自定义的优先级会高一点,不然收集不了
public void setConfigurers(List<WebMvcConfigurer> configurers) {
if (!CollectionUtils.isEmpty(configurers)) {
this.configurers.addWebMvcConfigurers(configurers);
}
}
3.WebMvcConfigurerAdapter(已标注失效),它之前存在的意义是提供了一套对应的WebMvcConfigurer接口空实现,主要为了方便子类继承,不用所有的方法都要再实现一遍;因为jdk1.8语法升级,接口类已经可以支持默认方法,所以WebMvcConfigurerAdapter就没有存在的意义了
4.WebMvcConfigurerComposite,看名字就知道,聚合了类型为WebMvcConfigurer的集合
5.DelegatingWebMvcConfiguration(WebMvcConfigurationSupport子类),真正干活的,通过@Autowired注入进来List<WebMvcConfigurer> configurers(所以在这里,我们可以实现自己的WebMvcConfigurer接口),循环调用聚合的WebMvcConfigurer实现类(回调),丰富WebMvcConfigurationSupport web组件
6.WebMvcAutoConfiguration为是springboot中自动装配MVC的,一旦容器中有WebMvcConfigurationSupport对象,将不再自动装配!
四.整个关系
五.综上,springboot有以下方式集成扩展MVC
1.@EnableWebMvc+继承WebMvcConfigurationAdapter,在扩展的类中重写父类的方法,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置
2.@EnableWebMvc+实现接口WebMvcConfigurer方法,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置
3.继承WebMvcConfigurationSupport,在扩展的类中重写父类的方法,这种方式会屏蔽springboot的@EnableAutoConfiguration中的设置
4.@EnableAutoConfiguration+继承WebMvcConfigurationAdapter,在扩展的类中重写父类的方法,自动装配
5.@EnableAutoConfiguration+实现接口WebMvcConfigurer方法,自动装配