8.1 MVC扩展配置的原理
意思是我们 如果想 自定义 MVC 或者 是 扩展 MVC,就必须 新建一个 配置类。然后 @Configuration
注解。@EnableWebMvc
就是直接托管。不会走默认的那些配置了。
当然 我们还得 实现 WebMvcConfigurer 接口 才可以。
我们可以尝试 配置一个 自己的 视图解析器。
- 分析视图解析器类的源码
ContentNegotiatingViewResolver
我们 发现 只要 实现了 视图解析器 接口的类,就可以把它 作为视图解析器。否则 ContentNegotiatingViewResolver 这个类 也不能被 SpringMVC 应用。但这个类 是自动帮我们装配的嘛。
- 是如何被自动装配上的呢?
实现的这个 接口,有个 核心的方法。而且 还就这一个 方法。。我们去看看 我们 是怎么实现 这个方法的。
有意思的地方来了,这里有行代码,是说 获取到 候选的视图。然后 再从这些 视图中 拿到 最好的 视图。
那我们 来看下 获取候选视图 是怎么 获取的。
我们发现 它是 进行了 遍历,然后 判断视图 是否为空,不为空,就加入到 candidateViews
这个 List 当中去。那么问题来了。this.viewResolvers
是 怎么 拿到的 数据???
答:直接 从 IOC 容器中 Bean 拿到的。就是 所谓的 注入,把这个东西注入进去了。
那么 我们就可以大胆的猜想,是不是 只要我们写一个 视图解析器。然后 给它 放到 IOC 里面 就可以了呢。
不知道大家是否还记得 SpringConfig 是怎么 把一个东西 配置到 IOC 容器中 成为 一个 Bean 的了。
就是 我们 弄一个方法,然后 @Bean
,这个方法 返回的 直接就是 一个类的 新建对象。
- 给 DispatcherServlet 打断点,来验证我们分析的原理正确
看到没有,这里 是不是 就被 装配进去了。
因为我们配置的 这个 视图解析器,在 IOC 容器当中,直接就被 加到 viewResolvers 里面去了。
那 有的人 就要说了,怎么识别的呢?答:这还不简单嘛,识别它的类型呀,它的类型 是 ViewResolver
所以 会被 自动的装配。
那么好,问题来了。我们 不用 @Bean
,而是 用 @Component
可以吗?
答:可以!!当然可以。只要 把它 放到 IOC 容器中,喔脚德就没问题。
- 再去 尝试下,重写 里面一些的方法。比如说
添加视图Controller
这玩意 我们 用 MVC 写的话,不就是 写一个方法,然后 注解嘛。那么这里的话,就是变化成了一个方法了,但是效果都一样!!!
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//WebMvcConfigurer.super.addViewControllers(registry);
registry.addViewController("/mqy").setViewName("hello");
}
.