开发者学堂课程【SpringBoot快速掌握 - 核心技术:扩展与全面接管 SpringMVC】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9245
扩展与全面接管 SpringMVC
内容介绍
一、 扩展 SpringMVC
二、 全面接管 SpringMVC
一、扩展 SpringMVC
如果您想保持 SpringBootMVC 特性,并且只想添加额外的 MVC 配置
(拦截器、格式化器、视图控制器等)您可以添加您自己的类型的
@Configuration类
Webl/vcConfigurerAdapter
,但没有@EnableWeblvc
。如果您希望提供 RequestMappingHandlerMapping,
RequestMappingHandlerAdapter 或除了离子处理异常解决您
可以声明提供此类组件的 WebMvcRegistrationsAdapter 实例。
如果您想完全控制 SpringMVC ,可以添加您自己的 @Configuration
@EnableWebMvc .
首先在 XML 文件中配置:
<mvc:view-controller path="/hello" view-name ="success"/>
<mvc:interceptors>
<mvc :interceptor>
<mve:mapping path=" /hello"1>
<bean></bean>
</mvc:interceptor>
</mvc : interceptors >
编写一个配置类 (@Configuration ),是 WebMvcConfigurerAdapter 类型;不能标注
@EnableWebMvc,并且有 @Configuration 才能称为配置类
既保留了所有的自动配置,也能用我们扩展的配置;
新建一个配置类:
//使用webtvcConfigurerAdapter可以来扩展Sprinmvc的功能
@Configuration
public class MyMrcConfig extends webMvcConfigurerAdapter {
@override
public void addViewControllers(ViewControllerRegistry registry){
//super.addviewControllers(registry) ;
//浏览器发送/atguigu 请求来到success
//设置一个视图映射规则,把什么请求映射到什么页面
registry.addviewController("/atguigu").setviewName( "success");
}
}
这些接口都在 spring boot 的配置里面,要做什么功能就在里面进行配置
Ctrl+o 进行方法重写
然后启动进行测试:访问 localhost:8080/aiguigu
返回成功!!
代表扩展 spring MVC 成功
原理:
1、WebMvcAutoConfiguration 是 SpringMVC 的自动配置类
2、在做其他自动配置时会导入; @
i
mport(EnableWebMvcConfiguration.class)
@Configuration
//继承了DelegatingWebMvcConfiguration,重要的是继承的父类
public static Class EnableWebMvCConf iguration extends Deleg atingWebMvcConfiguration {
private final WebMvCConf igurercomposite configurers = new WebrMvcConfigurerComposite();
//自动装配,从容器中获取所有的WebMvcConfi gurer
@Autowired(required = false)
public void setConfigurers(List configurers) {
if (
!
CollectionUtils ,isEmpty(configurers)) {
this. configurers . addwWebMvcConfigurers(configurers);
//一个参考实现;将所有的WebMcConfigurer相关配置都来一起调用;
@override
public void addViewControllers(ViewControllerRegistry registry) {
for (WebMvcConfigurer delegate : this.delegates) {
delegate. addViewControllers(registry);
/
/
拿到所有的
WebMvcConfigurer
并都配置一遍
}
}
}
}
3、容器中所有的 WebMcConfigurer 都会一起起作用 ;
4、我们的配置类也会被调用;
实现效果: SpringMVC 的自动配置和我们的扩展配置都会起作用;
如果您想完全控制 SpringMVC ,可以添加您自己的@Configuration
@EnableWebMvc .
二、全面接管 SpringMVC
SpringBoot 对 SpringMVC 的自动配置不需要了,所有都是我们自己配置;所有的 SpringMVC 的自动配置都失效了
我们需要在配置类中添加 @EnableWebMvc 即可;
//使用 WebMvcConfigurerAdapter 可以来扩展 SpringMVC的功能
@EnablewebMvc
@Configuration
public class MyMcConfig extends WebMvCConf igurerAdapter {
@Override
public void addViewControllers(ViemControllerRegistry registry) {
/
/super. addViewControllers(registry);
//浏览器发送/atguigu请求来到success
registry. addViewController(" /atguigu") .
setViewName("success");
}
}
重新启动,全面接管后,静态映射失效,其他默认配置都失效了
启动后控制台也没有打印默认配置
把 @EnablewebMvc 注释掉,重启默认配置就会重新生效
并且在浏览器中测试,其他默认配置都失效了
在日常中不推荐使用全面接管,因为我们都需要用到很多功能,全面接管需要自己配置
原理:
为什么 @EnableWebMvc 自动配置就失效了;
1、 @EnableWebMvc的核心
@Import(DelegatingWebNvcConfiguration. class)
public @interface EnableWebMvc {
配置自动失效;
@Configuration
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
private final WebMvcConfigurerComposite configurers = new WebMvcConf igurerComposite();
@Autowired(required = false)
public void setConfigurers(List configurers) {
if (!CollectionUtils. isEmpty( configurers)) {
this . configurers . addWebMvcConfigurers(configurers);
}
}
2、
@Configuration
public class DelegatingWebMvcConfiguration extends WebMcConfigurat ionsupport {
3、自动配置类签名
@Configuration
@Condit ionalOnWebApplication
@ConditionalOnClass({ Servlet.class,DispatcherServlet.class
WebMvcConfigurerAdapter.class })
//容器中没有这个组件的时候,这个自动配置类才生效
@ConditionalOnMissingBean(WebMvcConfigur ati onSupport .class)
@AutoConfi gureOrder( 0rdered .HIGHEST PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMVCAutoConf iguration {
4、@EnableWebMvC将WebMvcConfigurationSupport组件导入进来 ;所以说自动配置失效了,全部将由自己配置
5、导入的 WebMvcConfigurationSupport 只是 SpringMVC 最基本的功能;
注意:、在 SpringBoot 中会有 非常多的 xxxConfigurer 帮助我们进行扩展配置,遇见了一定要多加注意