日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringBoot_web开发-扩展与全面接管SpringMVC

發布時間:2024/4/13 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot_web开发-扩展与全面接管SpringMVC 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前面我們分析了SpringBoot對SpringMVC,自動配置的一些功能,但實際在開發過程中,僅靠Springboot的自動配置,是不夠用的,比如我來舉一個例子,我們以前有SpringMVC配置文件的時候,大家可能寫過這些標簽<mvc:view-controller path="/hello" view-name="success">視圖映射,我把hello的請求發到success,這樣視圖解析器也會幫我們配到success頁面,包括大家也寫過<mvc:interceptors></mvc>這是我們定義SpringMVC的攔截器<!--攔截器 --> <mvc:interceptors><!--多個攔截器,順序執行 --><mvc:interceptor><!-- 表示所有url包括子url路徑 --><mvc:mapping path="/**"/><bean class="com.learn.interceptor.SecurityInterceptor"></bean></mvc:interceptor> </mvc:interceptors>比如我們來攔截hello請求,然后是哪個攔截器我們用bean來標識上,這就是經常要做的配置,但沒了這個配置文件,這個功能能不能做,我們Springboot也提供了擴展,還是看我們之前的這段話,If you want to keep Spring Boot MVC features, and you just want to add additional MVC configuration (interceptors, formatters, view controllers etc.) you can add your own @Configuration class of type WebMvcConfigurerAdapter, but without @EnableWebMvc. If you wish to provide custom instances ofRequestMappingHandlerMapping, RequestMappingHandlerAdapter or ExceptionHandlerExceptionResolver you can declare a WebMvcRegistrationsAdapter instance providing such components.如果我們想要保持Spring boot對SpringMVC配置的這些功能,而且只是想給里面添加一些功能,比如interceptors,view controllers,我們可以添加一個自己的@Configuration,我們要做的就是,編寫一個配置類,這個配置類就是用@Configuration注解標注的,這個類才能成為配置類,來編寫一個配置類,這個類的類型是WebMvcConfigurerAdapter,是這個類型的,without @EnableWebMvc,我們還不能標注@EnableWebMvc注解,這個就是我們向來擴展的話就是這么來擴展,我來舉一個例子

想要實現剛才的這個功能,我們就來給他擴展一下,我們自己來寫一個配置類,首先要用@Configuration來標注,是一個配置類,而且還是WebMvcConfigurerAdapter這個類型,這是一個抽象類,我們繼承他就行了public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {繼承他有什么用呢,我們點進來看一下,里面有非常多的空方法,空方法其實是來源于這個接口的,public interface WebMvcConfigurer {這個接口就是SpringMVC的擴展配置,而我們實現接口太麻煩了,所以給我們適配器空方法,做什么功能就在這里配置,比如要做異步支持的這里有異步的,/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void configureAsyncSupport(AsyncSupportConfigurer configurer) { }/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { }這個標簽的功能<mvc:default-servlet-handler>就是我們寫的這個功能,包括下邊有添加Formatters的/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void addFormatters(FormatterRegistry registry) { }還有添加Interceptors/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void addInterceptors(InterceptorRegistry registry) { }Interceptors不就是這個功能嗎,/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { }給資源注冊的,之前的靜態資源映射規則,我們以后就來用它就行了,使用WebMvcConfigurerAdapter就可以擴展SpringMVC的功能,那怎么擴展呢,要什么功能就重寫什么方法就可以了,比如我們要添加視圖映射,我們就addViewControllers,剩下的都一樣,我這里有一個registry,有一個addViewController,添加一個視圖映射,首先是urlPath,你要把什么請求映射到頁面,瀏覽器發送/learn,去哪個頁面呢,繼續鏈式調用,setViewName,然后去哪個頁面,我們寫一個index,也是由我們視圖解析器來進行解析的,他的效果呢就是瀏覽器發送,/learn請求,然后也來到success頁面,我們直接來做視圖映射,http://localhost:8080/learn確實來到成功頁面了 package com.learn.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;@RestController public class HelloController {@ResponseBody@RequestMapping("/hello")public String hello() {return "hello";}@ResponseBody@RequestMapping("/success")public String success() {return "success";}} package com.learn.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/*** @Configuration:指明當前類是配置類;就是來替代之前的Spring配置文件* * 在配置文件中用<bean></bean>標簽添加組件* */ //@EnableWebMvc 不要接管SpringMVC @Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {// 瀏覽器發送/learn 請求來到successregistry.addViewController("/learn").setViewName("success");}} package com.learn;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @SpringBootApplication 來標注一個主程序類,說明這是一個Sprint Boot應用* @author Leon.Sun**/ //@ImportResource(locations= {"classpath:beans.xml"}) @SpringBootApplication public class SpringBoot02ConfigApplication {public static void main(String[] args) {// Spring應用啟動起來SpringApplication.run(SpringBoot02ConfigApplication.class,args);}} 要擴展SpringMVC就這么來用,這個是擴展SpringMVC,他既保留了所有的自動配置,也能用我們自己擴展的,那么這個原理是什么呢,我們也可以大概的來看一看,還是來到我們的WebMvc配置中,我們還是觀察他,WebMvcAutoConfiguration是SpringMVC的自動配置類,然后第二個我們來看,這里還有一個WebMvcAutoConfigurationAdapter,他也是繼承WebMvcConfigurerAdapter,他也是利用我們的Adapter機制,提供的方法,然后把組件添進去,我們之前的靜態資源映射,@Override public void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.resourceProperties.isAddMappings()) {logger.debug("Default resource handling disabled");return;}Integer cachePeriod = this.resourceProperties.getCachePeriod();if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(cachePeriod));}String staticPathPattern = this.mvcProperties.getStaticPathPattern();if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(this.resourceProperties.getStaticLocations()).setCachePeriod(cachePeriod));} }就是調用的addResourceHandlers方法,我們看這個類目的不是分析他,主要是他上面有一個@Import(EnableWebMvcConfiguration.class),@Configuration @Import(EnableWebMvcConfiguration.class) @EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class }) public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {我們在配置的時候呢,在做其他配置時,會導入什么呢,會導入EnableWebMvcConfiguration,那我說他的目的是干什么呢,還在WebMvc自動配置類中,它是繼承DelegatingWebMvcConfiguration/*** Configuration equivalent to {@code @EnableWebMvc}.*/ @Configuration public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {這個類的描述是這個樣子的,而這段描述里面重要的是什么呢,重要的是他繼承的父類,這個父類里面呢,有這么一段話@Configuration public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}這段話的作用是什么,@Autowired叫自動裝配,自動裝配什么呢,自動裝配一旦裝在方法上,方法的參數就要從容器中獲取,相當于這句話的作用就是說,從容器中獲取什么,你看這里是一個list,List<WebMvcConfigurer>,獲取所有的WebMvcConfigurer,然后把這些configure賦值到configurers里面,賦值到這里有啥用,我們注意,然后在這個里面,有我們之前的配置,每一個都是調configure的方法,比如視圖映射,@Override protected void addViewControllers(ViewControllerRegistry registry) {this.configurers.addViewControllers(registry); }他調的是configurers.addViewControllers(registry);我就以這個為例,我點進去看,@Override public void addViewControllers(ViewControllerRegistry registry) {for (WebMvcConfigurer delegate : this.delegates) {delegate.addViewControllers(registry);} }他其實是把所有的WebMvcConfigurer都拿來,private final List<WebMvcConfigurer> delegates = new ArrayList<WebMvcConfigurer>();delegates保存類的信息,他的一個參考實現,配置它是這樣子的,將所有的WebMvcConfigurer相關的配置都來一起調用,相當于一起起作用,不只是Spring Boot給我們的配置起作用,第二句話的核心目的,就在這,所有的容器中,所有的WebMvcConfigurer,都會一起來起作用,那就包括是不是我們自己寫的,自己寫的這個配置類,繼承了WebMvcConfigurerAdapter,Adapter就是我們的一個實現,我們的配置類,也會被調用,實現的效果是什么,首先使我們的SpringMVC自個的配置在起作用的時候,把我們的也順便召喚進來了,通過這種方式,SpringMVC的自動配置,和我們的擴展配置,都會起作用,這個就是我們說的如何擴展SpringMVC,不能夠標注@EnableWebMvc,標了他有啥特點呢,又看這句話If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.如果我們想完全的掌控Spring MVC,我們需要給我們的注解添加一個@EnableWebMvc,就是我們這個注解的作用,全面接管SpringMVC,所謂的全面接管SpringMVC,就是Spring Boot對SpringMVC的自動配置不要了,然后所有的都是我們自己配置,這個就類似于什么呢,類似于我們以前來開發三大框架整合的時候,剛把SpringMVC配進來,就是那個時候是什么樣子,就是什么樣子,我們在配置文件里面該要寫什么,你就來繼續自己來寫就行了,所有都是我們自己配置,只需要干什么呢,只需要加一個@EnableWebMvc,在配置類中添加@EnableWebMvc,那我們就來添一下,看一下他的效果是什么,我就來添加一個@EnableWebMvc,我們把它一添上以后呢,我來重新啟動,重新啟動的效果是什么呢,我們現在全面接管了SpringMVC,既然全面接管了,那相關于以前的SpringMVC自動配置,他是不是失效了,既然失效了,我就來測幾個,如果自動配置生效,控制臺在啟動的時候,我們來看這個打印,這里打印沒有見到相應的filter,如果我把這個注解注掉,我再來啟動,我們不全面接管,我們控制臺會打印hiddenHttpMethodFilter,所以我們這個filter寫過來了,包括我們再來測一下,我把這個注解開啟,我們全面接管了,就是SpringMVC對SpringBoot的自動配置失效,最典型的我們來測一下,就是我們這些靜態資源,webjars請求,或者靜態頁面,不能訪問了,如果我現在先不配他,我們的靜態頁面肯定能訪問的,我就直接訪問index頁面localhost:8080/沒問題,但是說如果我加上了這個@EnableWebMvc注解,全面接管,靜態資源映射失效,我來啟動一下,看能不鞥訪問首頁,localhost:8080/以及webjars請求呢,我們發現現在就404了 package com.learn.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/*** @Configuration:指明當前類是配置類;就是來替代之前的Spring配置文件* * 在配置文件中用<bean></bean>標簽添加組件* */ // 不要接管SpringMVC @EnableWebMvc @Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {// 瀏覽器發送/learn 請求來到successregistry.addViewController("/learn").setViewName("success");}} SpringBoot對我們提供的所有配置,都失效了,這里的效果就是所有的自動配置都失效,嚴格來說是SpringMVC的自動配置都失效了,連我們的靜態資源,都沒法用了,我們在類中加一個他就行了,全面接管我們就用這個樣式,當然我們后來開發不建議全面接管,如果說我們只是做一個簡單的功能,我們可以用全面接管,可以節省空間,但是我們往往是需要用非常多的功能的,原理是什么呢,為什么寫了一個他自動配置就失效了,為什么加了一個@EnableWebMvc,自動配置就失效了,非常簡單,來看一下,@EnableWebMvch核心在這,這個注解的核心就是導入一個他@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }@EnableWebMvch核心就是導入DelegatingWebMvcConfiguration,這個東西我點進來,他就是我們看的組合邏輯@Configuration public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();@Autowired(required = false)public void setConfigurers(List<WebMvcConfigurer> configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}他的父類點進來,他給我們做基本的配置,RequestMappingHandlerMapping,這父類我們就不看了,那么看他有什么用呢,他怎么把自動配置給失效了呢,那你回頭再來看一下自動配置,@Configuration @ConditionalOnWebApplication @ConditionalOnClass({ Servlet.class, DispatcherServlet.class,WebMvcConfigurerAdapter.class }) @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration {有一個非常重要的一句話,@ConditionalOnMissingBean(WebMvcConfigurationSupport.class),啥叫OnMissingBean,容器中沒有這個組件的時候,接下來自動配置類里面的所有功能,才起效,這個自動配置類才生效,既然容器中沒有WebMvcConfigurationSupport,而剛才我們@EnableWebMvc,給我們容器中導了這么一個組件,這個組件正是WebMvcConfigurationSupport,也就是說一句話,這個@EnableWebMvc幫我們把這個組件導進來了,所以自動配置類判斷失效了,接下來就由我們配置了,將WebMvcConfigurationSupport組件導入進來了,導入的這個組件只是SpringMVC的基本功能,像那些視圖解析器,包括攔截器,都需要自己再來配置一下,這就是我們使用@EnableWebMvc可以全面接管,用不到SpringBoot的任何自動配置,當然這樣希望大家更能吸取這種模式,我們如何改SpringBoot的配置呢,在SpringBoot里邊,又會有很多很多的類似的Configure,有異步的Configure支持,Configure就是幫我們進行配置擴展的,在SpringBoot中,會有非常多的xxxxConfigurer,幫助我們進行擴展配置,只要遇見他們了,大家多留心

?

總結

以上是生活随笔為你收集整理的SpringBoot_web开发-扩展与全面接管SpringMVC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。