SpringBoot---初探MVC自动配置原理 (2)

SpringBoot---初探MVC自动配置原理

果然看到了自定义的ViewResolver,并且ContentNegotiatingViewResolver是优先级最高的。

FormattingConverter 格式转换器

在WebMvcAutoConfiguration类里,可以找到格式转换的方法。

SpringBoot---初探MVC自动配置原理

可以发现这些方法去WebMvcProperties类拿到了相应的属性值,熟悉的properties类,也就是说这些值是可以直接配置的,prefix为spring.mvc.format

SpringBoot---初探MVC自动配置原理

再看一眼WebMvcProperties类的结构吧,format是其中一个静态内部类

SpringBoot---初探MVC自动配置原理

修改SpringBoot的默认配置 @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/ttttt").setViewName("test"); }

SpringBoot---初探MVC自动配置原理

跳转成功

扩展原理

WebMvcAutoConfiguration类 是 SpringMVC的自动配置类,里面有一个静态内部类WebMvcAutoConfigurationAdapter

SpringBoot---初探MVC自动配置原理

这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class),点进EnableWebMvcConfiguration类看一下,它继承了DelegatingWebMvcConfiguration类

SpringBoot---初探MVC自动配置原理

可以看到EnableWebMvcConfiguration类也是WebMvcAutoConfiguration类 的静态内部类

看看DelegatingWebMvcConfiguration类

SpringBoot---初探MVC自动配置原理

只有一个属性configurers,类型是WebMvcConfigurerComposite,Composite是拼合的意思,我暂时将其理解为一些WebMvcConfigurer的集合,再点WebMvcConfigurerComposite类看看

SpringBoot---初探MVC自动配置原理

也只有一个属性,delegates,类型是List<WebMvcConfigurer>,和我们刚才的猜测基本一致。

delegate意为委托

SpringBoot:最佳英语学习工具

回到DelegatingWebMvcConfiguration类,找一个方法参考下

@Override protected void addViewControllers(ViewControllerRegistry registry) { this.configurers.addViewControllers(registry); }

通过上一步已经知道configurers是WebMvcConfigurerComposite类,点开这个方法

@Override public void addViewControllers(ViewControllerRegistry registry) { for (WebMvcConfigurer delegate : this.delegates) { delegate.addViewControllers(registry); } }

将所有的WebMvcConfigurer相关配置来一起调用!包括我们自己配置的和Spring给我们配置的

全面接管SpringMVC

If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc, or alternatively add your own @Configuration-annotated DelegatingWebMvcConfiguration as described in the Javadoc of @EnableWebMvc.

使用@EnableWebMvc可以让SpringBoot的webmvc配置失效

看看@EnableWebMvc注解如何让自动配置失效

@Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }

导入了DelegatingWebMvcConfiguration类,这个类在扩展原理第三步出现了,此类继承了WebMvcConfigurationSupport类

/** * This is the main class providing the configuration behind the MVC Java config. */ public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {}

这是Java方式MVC配置的主类

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgdpp.html