1. 程式人生 > 其它 >15-SpringMVC配置原理和擴充套件

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包,放到下面的位置