11springboot的MVC配置原理

摘要:
ContentNegotiatingViewResolver类是一个由springboot自动组装的视图解析器,它实现了视图解析器的接口。因此,关键是视图解析器的接口。进入ViewResolver接口,可以发现它包含一个resolveViewName()方法,该方法用于解析视图。自定义视图解析器首先在自己创建的mvc配置类中创建一个静态类,以实现视图解析器的ViewResolver接口,然后重写其中的方法,如下所示:/**扩展mvc。如果您想定制一些功能,只需编写这个组件,然后将其提交给springboot,它将自动为我们组装。
springboot的MVC配置原理

springboot现在是实现了mvc的自动配置,但是如果要修改/添加mvc的配置呢,比如上一篇的thymeleaf模板引擎,就自动配置了视图解析器,添加了前缀:classpath:/templates/和后缀:.html 。这样 访问方法的映射路径时,就不用添加文件的路径和后缀名,但是如果访问的文件不在 tmplates文件夹下或者是你想要访问的文件后缀不是html,那么应该怎么重新修改mvc的配置呢?接下来进入官方文档看mvc扩展/修改的说明,如下图:

image-20200901101955080

可以发现如果要扩展/修改 mvc配置 需要给自定义的mvc类添加 @Configuration注解 和 实现 WebMvcConfigurer接口,接下来用自定义视图解析器例子说明.

默认的视图解析器

springboot的自动装配的视图解析器是通过ContentNegotiatingViewResolver类(上图的第一个)来实现的,如果要自定义视图解析器,就得进入这个类去了解,如下图:

image-20200901113325980

可以发现该类实现了ViewResolver接口一般实现了视图解析器接口的类,都可以把它看作视图解析器,所以想要自定义视图解析器就需要实现该接口。ContentNegotiatingViewResolver类是springboot自动装配的视图解析器,而且该类实现视图解析器的接口,所以关键是视图解析器的接口,所以进入到ViewResolver接口可以发现里面包含一个resolveViewName()方法,该方法的作用是解析视图。接下来返回ContentNegotiatingViewResolver类中查看是怎么重写resolveViewName()方法的,如下图:

image-20200901115244570

核心是红框部分,getCandidateViews()方法是获取所有的候选视图,该方法里面是循环所有的视图解析器,然后通过视图解析器去获取所有视图并添加到视图候选区;getBestView()是从候选区中获取最好的视图,最后返回最好的视图,接下来实现自定义视图解析器。

自定义视图解析器

首先在自己创建的mvc配置类里面创建一个静态类去实现视图解析器的ViewResolver接口,然后重写里面的方法,如下:

/**
 * 扩展mvc,如果你想要diy一些定制化的功能,只要写这个组件,然后将它交给springboot,springboot会自动帮我们装配。
 */

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    
    //把视图解析器放入ioc容器中才会生效
    @Bean
    public ViewResolver myViewResolve(){
        return new MyViewResolve();
    }

    
    //自定义一个自己的视图解析器,并重写里面的方法
    public static class MyViewResolve implements ViewResolver{

        @Override
        public View resolveViewName(String viewName, Locale locale) throws Exception {
            return null;
        }
    }
}

然后测试一下,自己自定义的视图解析器是否生效了,如下:

所有请求都会经过DispatcherServlet类doDispatch()方法,所以在doDispatch()打断点,如下图:

image-20200901133415200

可以发现是可以识别到自定义的视图解析器。

springboot的MVC扩展

要想扩展mvc,根据官方文档说明,如下图:

image-20200902221250065

扩展mvc的配置类,必须实现WebMvcConfigurer接口和添加@Configuration注解 ,但是不能添加@EnableWebMvc注解,因为添加该注解会让springboot的mvc自动配置失效,如下:

image-20200902222138717

上图是springmvc自动配置的类,上面红框部分是一个条件,如果该WebMvcConfigurationSupport类不存在则当前自动配置生效,这个类和@EnableWebMvc注解有联系的,进入到@EnableWebMvc注解里面,如下:

image-20200902222730779

该注解导入了一个类,在进入到该类,如下:

image-20200902222757477

可以发现该类继承了WebMvcConfigurationSupport类,所以所以添加了@EnableWebMvc注解就相当于添加了WebMvcConfigurationSupport类,而mvc自动配置的类启动条件@ConditionalOnMissingBean中,是规定不能存在WebMvcConfigurationSupport类,存在则webMvc自动配置类失效。

所以官网 强调 自定义扩展mvc,不能添加@EnableWebMvc注解。

上面的自定义视图解析器就是mvc扩展的一个例子,接下来在使用一个例子说明,mvc是如何扩展的,如下:

/**
 * 扩展mvc
 */

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    //视图跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //返回/abc会跳转到test.html
        registry.addViewController("/abc").setViewName("test");
    }
}

访问结果如下:

image-20200902224910942

访问abc映射路径,只有测试两字,而访问原来的test映射路径,多了一些值,是因为,该test映射路径里面添加了值。

该扩展是一个视图跳转,通常默认是浏览器访问是访问controller层的映射,但是这里添加了额外的映射,访问/abc会映射test.html视图。

总结

自定义配置类,必须实现WebMvcConfigurer接口和添加@Configuration注解 和属性类xxProperties,并且配置类要添加一些配置类的启动条件@ConditionalXX 和添加@EnableConfigurationProperties注解启动对应的属性类xxProperties。

免责声明:文章转载自《11springboot的MVC配置原理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS 流布局 UICollectionView使用(UICollectionVIew的代理方法)django-实现登录短信验证下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF MVVM模式

什么是MVVM模式,Model(模型)-View(视图)-ViewModel(视图模型) 先来讲MVC模式,模型-视图-控制器,相信大多数人都用过原理无非是: 页面产生某个请求,先找到页面对应的控制器,然后触发控制器的方法,控制器去模型调取数据拿回来,再返回给相应的视图,最后呈现页面。 MVVM模式原理类似MVC,只不过中间的不叫控制器了叫视图模型,功能也...

idea 未实现接口红线错误提示,重复代码波浪线提示

01,Could not autowire. No beans of 'UserMapper' type found 01.1,问题描述,通过反射动态实现的接口在调用时会出现以上提示,常见的如 ORM 框架的 Dao 层 01.2,该错误不是代码问题,可以手动关闭该错误,如下,去掉方括号里面的勾选 02,Found duplicated code 02...

.Net Core JWT 动态设置接口与权限

通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权。可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解,但是还是不能根治。 所以,就需要动态的设置接口与权限,由我们自己来处理。 我们先创建一个类PermissionRequirement 继承接口IAuthori...

微信小程序的模板消息与小程序订阅消息

小程序订阅消息功能介绍消息能力是小程序能力中的重要组成,我们为开发者提供了订阅消息能力,以便实现服务的闭环和更优的体验。 订阅消息推送位置:服务通知订阅消息下发条件:用户自主订阅订阅消息卡片跳转能力:点击查看详情可跳转至该小程序的页面 使用说明步骤一:获取模板 ID在微信公众平台手动配置获取模板 ID:登录 https://mp.weixin.qq.co...

支付宝接口(扫码支付的原理)使用文档说明 支付宝异步通知(notify_url)与return_url

支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类。 A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式 B页面跳转通知,对应的参数为return_url,支付宝通知使用GET方式 (通知地址不需要像以前一样去账户内设置,而是由客户在支付的时候通过参数传递给我地址。 例如...

Python实战---制作专属有声小说(调用百度语音合成接口)

这一次的目标是使用百度云的人工智能接口,实现文字转语音的实时转换,将小说文字转换成语音朗读出来。 百度云接口调用 百度的这个接口对于我们普通用户非常友好,他的很多功能都是免费的,而且我们每天可以免费调用这个接口五千次,非常适合我们玩转这些功能。 注册百度云账号 首先打开百度云语音合成模块接口地址 打开网址后点击《立即使用》选项,然后会出现登录的选项界面。如...