springBoot web開發(需要解決的問題 4/4)

從springMvc過渡到springboot Web開發
要解決的問題:

  • 導入靜態資源,…
  • 首頁
  • jsp,模板引擎Thymeleaf
  • 裝配擴展SpringMVC
    接上面的博客寫一下關於mvc的配置原理
    1.mvc的配置原理
    放一張官網地址:https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-spring-mvc-auto-configuration

找到文檔:
在這裏插入圖片描述由於springboot自己接管了視圖解析器,但是雖然說它自己接管了但是我們還是可以自己定製一個:

package com.qiu.config;

import com.sun.org.apache.regexp.internal.RE;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.Locale;

//想用這個類全面擴展mvc配置
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    //如果你想diy一些定製化的功能,只需要寫這個組件,然後交給springboot,springboot就會幫我們裝配
    //public interface ViewResolver 實現了視圖解析器的類我們就可以把它看做視圖解析器
    //由於springboot自動裝配了視圖解析器所以,我們要想辦法自己接管,

    @Bean
    public  ViewResolver myViewResolver(){
        return new MyViewResolver();
    }

    //自定義了一個自己的視圖解析器.
    public static class MyViewResolver implements ViewResolver{

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

}

上述代碼就是自己寫了一個視圖解析器,但是springboot怎麼去找到我們的這個自定義的視圖解析器呢?
看源碼:
在這裏插入圖片描述
這裏就是說,先把所有的視圖解析放在集合中,然後通過條件去選擇.
getCandidateViews中看到他是把所有的視圖解析器拿來,進行while循環,挨個解析!

在這裏插入圖片描述2.格式化轉換器(消息需要格式化)
第一件事找源碼:
從WebMvcAutoConfiguration類中查找FormattingConversionService
如下圖:
在這裏插入圖片描述發現它的轉換格式在mvcproperties中,再從mvcproperties中查到格式爲下圖所示.
在這裏插入圖片描述因爲WebMvcAutoConfiguration–>WebMvcProperties–>application.yaml他們之間是有聯繫的,所以我們可以從配置文件中配置想要的格式

#自定義的日期格式化

spring.mvc.data-format=""

視圖跳轉:

package com.qiu.config;

import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//如果我們要擴展springMVC官方建議我們這樣去做
@EnableWebMvc //它就是導入了一個類:@Import({DelegatingWebMvcConfiguration.class}):作用:從容器中獲取所有的webmvcconfig
@Controller
public class MyMvcConfig2 implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/qiu").setViewName("test");
    }
}

我們需要注意的是官方文檔的一句話:
在這裏插入圖片描述爲什麼不建議去帶上@EnableWebMvc.
首先我們先去查看這個類:
在這裏插入圖片描述他做的就是導入了這個類:
再去查看這個類:
在這裏插入圖片描述在這裏插入圖片描述但是這似乎並沒有解釋到爲什麼接管MVC的時候不能加這個註解.
我們接着看:找到類:WebMvcAutoConfiguration.找到靜態內部類
在這裏插入圖片描述在這裏插入圖片描述繼承的就是我們上面標註的那個類.
在這裏插入圖片描述再回到WebMvcAutoConfiguration,註解裏面有一個條件:@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
意思就是這個類存在就不生效,不存在則生效.當我們加上了@EnableWebMvc.這個註解的時候,它導入的類(DelegatingWebMvcConfiguration.class),繼承了(WebMvcConfigurationSupport)進而加載了這個類,使得這個類存在了.
所以會導致整個配置類全部失效.
這個時候就應該能理解官方文檔的這句話了.
在spring中,有非常多的xxxxConfiguration.這種配置類就是進行擴展的.可以幫助我們進行擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章