Live2D
复制代码

15-SpringMVC配置原理和扩展

1、springboot中SpringMVC配置原理

首先我们到spring官网中查看springboot的SpringMVC自动配置说明文档:https://docs.spring.io/spring-boot/docs/2.4.6/reference/html/spring-boot-features.html#boot-features-developing-web-applications
  • 扩展SpringMVC

    首先我们创建一个config包,然后在其中创建一个MyMvcConfig,实现WebMvcConfigurer接口,用来扩展springboot的SpringMVC
    我们直接Ctrl+o查看父类或者接口中可重写的方法,如下

    比如我们要添加拦截器的时候,我们之前需要创建一个类,然后实现Interceptor这个接口。在这里我们只需要实现addInterceptors这个方法就行了。
    我们分析SpringMVC这个自动配置类帮我们默认配置了哪些视图解析器,由官网可以知道有两个
    那么我们查看一下ContentNegotiatingViewResolver的源码,可以看到只要是实现了ViewResolver接口的就是一个视图解析器
    而且ViewResolver接口中有一个解析视图的方法:resolveViewName()

    我们看一下视图解析器中是怎么去实现该方法的

    从上图可知,怎么获取视图的呢?查看getCandidateViews()方法的源码,如下

    自己添加一个视图解析器:在这个配置类中定义一个静态内部类,实现ViewResolver接口,重写其中的方法,然后用@Bean修饰一个方法,该方法返回一个静态内部类的对象,将这个自定义的视图解析器放进容器中。
    //扩展SpringMVC
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
        
        //将自定义视图解析器放进容器中
        @Bean
        public static MyViewResolver getViewResolver(){
            return new MyViewResolver();
        }
    
        //只要实现了ViewResolver接口的类都是视图解析器,自定义视图解析器
        public static class MyViewResolver implements ViewResolver{
            @Override
            public View resolveViewName(String s, Locale locale) throws Exception {
                return null;
            }
        }
    
    }
    
    
    因为我们使用SpringMVC都需要一个DispatcherServlet中央调度器,其中有个方法叫doService,该方法中调用了一个doDispatch方法,

    程序执行时,所有的请求和响应都会经过该方法

    那么我们在这个方法中打个断点,然后debug程序,输入一个URL回车,进入debug,执行到下面这条语句。

    从上图中我们可以知道,我们想要自定义一些配置或者功能,只需要写好这个组件,然后交给springboot的IOC容器,springboot就会帮我们自动装配。
  • 其他MVC的扩展

    消息格式转换器

    我们在WebMvcAutoConfiguration中查找一下Formatter,找到一个方法,源码如下

    getFormat方法会默认使用dd/MM/yy这样格式的进行转换,也就是说我们到日期字符串必须是/分隔的,而不能用2021-06-04这样的格式,但是我们可以在配置文件中修改。

    只不过现在还不清楚上图配置文件中这两个配置具体起的作用有什么不同,以后再分析。
  • 写一个视图解析跳转的配置

    我们以前使用SpringMVC的时候,在处理器跳转到静态资源的时候需要用ModelAndView中的setViewName方法进行跳转,方法中的参数是静态资源名
     @RequestMapping(value = "/otherOne.do")
        public ModelAndView doOtherOne() {   //相当于doGet/doPost方法
    
            //这里语句相当于调用service中的方法
    
            ModelAndView modelAndView = new ModelAndView();
            //然后把返回结果存储到ModelAndView对象中,该对象是键值对的map集合
            modelAndView.addObject("msg", "SpringMVC的第一个实例项目");
            modelAndView.addObject("fun", "非常高兴认识您");
    
            modelAndView.setViewName("show");
            modelAndView.setViewName("other");
    
            return modelAndView;
    
        }
    
    这里我们直接在配置类中重写方法进行实现
    //扩展SpringMVC
    @Configuration
    public class MyMvcConfig implements WebMvcConfigurer {
    
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
    
            //浏览器发送/alone到请求,会跳转到index.html页面
            registry.addViewController("/alone").setViewName("index");
    
        }
    }
    
    

    这是存储在templates目录中的index.html
  • 探究我们扩展SpringMVC时创建的配置类不能有@EnableWebMvc这个注解修饰

    查看该注解源码

    可以看到该注解只是往容器中导入了一个DelegatingWebMvcConfiguration.class对象,这个类的作用就是获取所有的WebMvcConfig,而且这个类继承了WebMvcConfigurerSupport这个类

    那么我们再看一下WebMvcAutoConfiguration这个类的修饰注解

    可以发现该自动配置类想要生效,容器中不能有WebMvcConfigurerSupport这个组件,包括其子类组件。
  • 如何写stater

    首先我们要编写一个XxxConfiguration的配置类,再写一个XxxProperties属性类去绑定这个配置类和配置文件。如果我们还希望这个配置类在某种情况下才生效的话就在类上面添加@Conditional的一些派生注解。最后打成jar包,放到下面的位置

posted @ 2021-06-25 15:59  Milen-jie  阅读(93)  评论(0编辑  收藏  举报