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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

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

發(fā)布時(shí)間:2024/4/13 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringBoot_web开发-扩展与全面接管SpringMVC 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前面我們分析了SpringBoot對(duì)SpringMVC,自動(dòng)配置的一些功能,但實(shí)際在開(kāi)發(fā)過(guò)程中,僅靠Springboot的自動(dòng)配置,是不夠用的,比如我來(lái)舉一個(gè)例子,我們以前有SpringMVC配置文件的時(shí)候,大家可能寫(xiě)過(guò)這些標(biāo)簽<mvc:view-controller path="/hello" view-name="success">視圖映射,我把hello的請(qǐng)求發(fā)到success,這樣視圖解析器也會(huì)幫我們配到success頁(yè)面,包括大家也寫(xiě)過(guò)<mvc:interceptors></mvc>這是我們定義SpringMVC的攔截器<!--攔截器 --> <mvc:interceptors><!--多個(gè)攔截器,順序執(zhí)行 --><mvc:interceptor><!-- 表示所有url包括子url路徑 --><mvc:mapping path="/**"/><bean class="com.learn.interceptor.SecurityInterceptor"></bean></mvc:interceptor> </mvc:interceptors>比如我們來(lái)攔截hello請(qǐng)求,然后是哪個(gè)攔截器我們用bean來(lái)標(biāo)識(shí)上,這就是經(jīng)常要做的配置,但沒(méi)了這個(gè)配置文件,這個(gè)功能能不能做,我們Springboot也提供了擴(kuò)展,還是看我們之前的這段話,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對(duì)SpringMVC配置的這些功能,而且只是想給里面添加一些功能,比如interceptors,view controllers,我們可以添加一個(gè)自己的@Configuration,我們要做的就是,編寫(xiě)一個(gè)配置類,這個(gè)配置類就是用@Configuration注解標(biāo)注的,這個(gè)類才能成為配置類,來(lái)編寫(xiě)一個(gè)配置類,這個(gè)類的類型是WebMvcConfigurerAdapter,是這個(gè)類型的,without @EnableWebMvc,我們還不能標(biāo)注@EnableWebMvc注解,這個(gè)就是我們向來(lái)擴(kuò)展的話就是這么來(lái)擴(kuò)展,我來(lái)舉一個(gè)例子

想要實(shí)現(xiàn)剛才的這個(gè)功能,我們就來(lái)給他擴(kuò)展一下,我們自己來(lái)寫(xiě)一個(gè)配置類,首先要用@Configuration來(lái)標(biāo)注,是一個(gè)配置類,而且還是WebMvcConfigurerAdapter這個(gè)類型,這是一個(gè)抽象類,我們繼承他就行了public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {繼承他有什么用呢,我們點(diǎn)進(jìn)來(lái)看一下,里面有非常多的空方法,空方法其實(shí)是來(lái)源于這個(gè)接口的,public interface WebMvcConfigurer {這個(gè)接口就是SpringMVC的擴(kuò)展配置,而我們實(shí)現(xiàn)接口太麻煩了,所以給我們適配器空方法,做什么功能就在這里配置,比如要做異步支持的這里有異步的,/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void configureAsyncSupport(AsyncSupportConfigurer configurer) { }/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { }這個(gè)標(biāo)簽的功能<mvc:default-servlet-handler>就是我們寫(xiě)的這個(gè)功能,包括下邊有添加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不就是這個(gè)功能嗎,/*** {@inheritDoc}* <p>This implementation is empty.*/ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { }給資源注冊(cè)的,之前的靜態(tài)資源映射規(guī)則,我們以后就來(lái)用它就行了,使用WebMvcConfigurerAdapter就可以擴(kuò)展SpringMVC的功能,那怎么擴(kuò)展呢,要什么功能就重寫(xiě)什么方法就可以了,比如我們要添加視圖映射,我們就addViewControllers,剩下的都一樣,我這里有一個(gè)registry,有一個(gè)addViewController,添加一個(gè)視圖映射,首先是urlPath,你要把什么請(qǐng)求映射到頁(yè)面,瀏覽器發(fā)送/learn,去哪個(gè)頁(yè)面呢,繼續(xù)鏈?zhǔn)秸{(diào)用,setViewName,然后去哪個(gè)頁(yè)面,我們寫(xiě)一個(gè)index,也是由我們視圖解析器來(lái)進(jìn)行解析的,他的效果呢就是瀏覽器發(fā)送,/learn請(qǐng)求,然后也來(lái)到success頁(yè)面,我們直接來(lái)做視圖映射,http://localhost:8080/learn確實(shí)來(lái)到成功頁(yè)面了 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:指明當(dāng)前類是配置類;就是來(lái)替代之前的Spring配置文件* * 在配置文件中用<bean></bean>標(biāo)簽添加組件* */ //@EnableWebMvc 不要接管SpringMVC @Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {// 瀏覽器發(fā)送/learn 請(qǐng)求來(lái)到successregistry.addViewController("/learn").setViewName("success");}} package com.learn;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @SpringBootApplication 來(lái)標(biāo)注一個(gè)主程序類,說(shuō)明這是一個(gè)Sprint Boot應(yīng)用* @author Leon.Sun**/ //@ImportResource(locations= {"classpath:beans.xml"}) @SpringBootApplication public class SpringBoot02ConfigApplication {public static void main(String[] args) {// Spring應(yīng)用啟動(dòng)起來(lái)SpringApplication.run(SpringBoot02ConfigApplication.class,args);}} 要擴(kuò)展SpringMVC就這么來(lái)用,這個(gè)是擴(kuò)展SpringMVC,他既保留了所有的自動(dòng)配置,也能用我們自己擴(kuò)展的,那么這個(gè)原理是什么呢,我們也可以大概的來(lái)看一看,還是來(lái)到我們的WebMvc配置中,我們還是觀察他,WebMvcAutoConfiguration是SpringMVC的自動(dòng)配置類,然后第二個(gè)我們來(lái)看,這里還有一個(gè)WebMvcAutoConfigurationAdapter,他也是繼承WebMvcConfigurerAdapter,他也是利用我們的Adapter機(jī)制,提供的方法,然后把組件添進(jìn)去,我們之前的靜態(tài)資源映射,@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));} }就是調(diào)用的addResourceHandlers方法,我們看這個(gè)類目的不是分析他,主要是他上面有一個(gè)@Import(EnableWebMvcConfiguration.class),@Configuration @Import(EnableWebMvcConfiguration.class) @EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class }) public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapter {我們?cè)谂渲玫臅r(shí)候呢,在做其他配置時(shí),會(huì)導(dǎo)入什么呢,會(huì)導(dǎo)入EnableWebMvcConfiguration,那我說(shuō)他的目的是干什么呢,還在WebMvc自動(dòng)配置類中,它是繼承DelegatingWebMvcConfiguration/*** Configuration equivalent to {@code @EnableWebMvc}.*/ @Configuration public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration {這個(gè)類的描述是這個(gè)樣子的,而這段描述里面重要的是什么呢,重要的是他繼承的父類,這個(gè)父類里面呢,有這么一段話@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叫自動(dòng)裝配,自動(dòng)裝配什么呢,自動(dòng)裝配一旦裝在方法上,方法的參數(shù)就要從容器中獲取,相當(dāng)于這句話的作用就是說(shuō),從容器中獲取什么,你看這里是一個(gè)list,List<WebMvcConfigurer>,獲取所有的WebMvcConfigurer,然后把這些configure賦值到configurers里面,賦值到這里有啥用,我們注意,然后在這個(gè)里面,有我們之前的配置,每一個(gè)都是調(diào)configure的方法,比如視圖映射,@Override protected void addViewControllers(ViewControllerRegistry registry) {this.configurers.addViewControllers(registry); }他調(diào)的是configurers.addViewControllers(registry);我就以這個(gè)為例,我點(diǎn)進(jìn)去看,@Override public void addViewControllers(ViewControllerRegistry registry) {for (WebMvcConfigurer delegate : this.delegates) {delegate.addViewControllers(registry);} }他其實(shí)是把所有的WebMvcConfigurer都拿來(lái),private final List<WebMvcConfigurer> delegates = new ArrayList<WebMvcConfigurer>();delegates保存類的信息,他的一個(gè)參考實(shí)現(xiàn),配置它是這樣子的,將所有的WebMvcConfigurer相關(guān)的配置都來(lái)一起調(diào)用,相當(dāng)于一起起作用,不只是Spring Boot給我們的配置起作用,第二句話的核心目的,就在這,所有的容器中,所有的WebMvcConfigurer,都會(huì)一起來(lái)起作用,那就包括是不是我們自己寫(xiě)的,自己寫(xiě)的這個(gè)配置類,繼承了WebMvcConfigurerAdapter,Adapter就是我們的一個(gè)實(shí)現(xiàn),我們的配置類,也會(huì)被調(diào)用,實(shí)現(xiàn)的效果是什么,首先使我們的SpringMVC自個(gè)的配置在起作用的時(shí)候,把我們的也順便召喚進(jìn)來(lái)了,通過(guò)這種方式,SpringMVC的自動(dòng)配置,和我們的擴(kuò)展配置,都會(huì)起作用,這個(gè)就是我們說(shuō)的如何擴(kuò)展SpringMVC,不能夠標(biāo)注@EnableWebMvc,標(biāo)了他有啥特點(diǎn)呢,又看這句話If you want to take complete control of Spring MVC, you can add your own @Configuration annotated with @EnableWebMvc.如果我們想完全的掌控Spring MVC,我們需要給我們的注解添加一個(gè)@EnableWebMvc,就是我們這個(gè)注解的作用,全面接管SpringMVC,所謂的全面接管SpringMVC,就是Spring Boot對(duì)SpringMVC的自動(dòng)配置不要了,然后所有的都是我們自己配置,這個(gè)就類似于什么呢,類似于我們以前來(lái)開(kāi)發(fā)三大框架整合的時(shí)候,剛把SpringMVC配進(jìn)來(lái),就是那個(gè)時(shí)候是什么樣子,就是什么樣子,我們?cè)谂渲梦募锩嬖撘獙?xiě)什么,你就來(lái)繼續(xù)自己來(lái)寫(xiě)就行了,所有都是我們自己配置,只需要干什么呢,只需要加一個(gè)@EnableWebMvc,在配置類中添加@EnableWebMvc,那我們就來(lái)添一下,看一下他的效果是什么,我就來(lái)添加一個(gè)@EnableWebMvc,我們把它一添上以后呢,我來(lái)重新啟動(dòng),重新啟動(dòng)的效果是什么呢,我們現(xiàn)在全面接管了SpringMVC,既然全面接管了,那相關(guān)于以前的SpringMVC自動(dòng)配置,他是不是失效了,既然失效了,我就來(lái)測(cè)幾個(gè),如果自動(dòng)配置生效,控制臺(tái)在啟動(dòng)的時(shí)候,我們來(lái)看這個(gè)打印,這里打印沒(méi)有見(jiàn)到相應(yīng)的filter,如果我把這個(gè)注解注掉,我再來(lái)啟動(dòng),我們不全面接管,我們控制臺(tái)會(huì)打印hiddenHttpMethodFilter,所以我們這個(gè)filter寫(xiě)過(guò)來(lái)了,包括我們?cè)賮?lái)測(cè)一下,我把這個(gè)注解開(kāi)啟,我們?nèi)娼庸芰?就是SpringMVC對(duì)SpringBoot的自動(dòng)配置失效,最典型的我們來(lái)測(cè)一下,就是我們這些靜態(tài)資源,webjars請(qǐng)求,或者靜態(tài)頁(yè)面,不能訪問(wèn)了,如果我現(xiàn)在先不配他,我們的靜態(tài)頁(yè)面肯定能訪問(wèn)的,我就直接訪問(wèn)index頁(yè)面localhost:8080/沒(méi)問(wèn)題,但是說(shuō)如果我加上了這個(gè)@EnableWebMvc注解,全面接管,靜態(tài)資源映射失效,我來(lái)啟動(dòng)一下,看能不鞥訪問(wèn)首頁(yè),localhost:8080/以及webjars請(qǐng)求呢,我們發(fā)現(xiàn)現(xiàn)在就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:指明當(dāng)前類是配置類;就是來(lái)替代之前的Spring配置文件* * 在配置文件中用<bean></bean>標(biāo)簽添加組件* */ // 不要接管SpringMVC @EnableWebMvc @Configuration public class MyMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {// 瀏覽器發(fā)送/learn 請(qǐng)求來(lái)到successregistry.addViewController("/learn").setViewName("success");}} SpringBoot對(duì)我們提供的所有配置,都失效了,這里的效果就是所有的自動(dòng)配置都失效,嚴(yán)格來(lái)說(shuō)是SpringMVC的自動(dòng)配置都失效了,連我們的靜態(tài)資源,都沒(méi)法用了,我們?cè)陬愔屑右粋€(gè)他就行了,全面接管我們就用這個(gè)樣式,當(dāng)然我們后來(lái)開(kāi)發(fā)不建議全面接管,如果說(shuō)我們只是做一個(gè)簡(jiǎn)單的功能,我們可以用全面接管,可以節(jié)省空間,但是我們往往是需要用非常多的功能的,原理是什么呢,為什么寫(xiě)了一個(gè)他自動(dòng)配置就失效了,為什么加了一個(gè)@EnableWebMvc,自動(dòng)配置就失效了,非常簡(jiǎn)單,來(lái)看一下,@EnableWebMvch核心在這,這個(gè)注解的核心就是導(dǎo)入一個(gè)他@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented @Import(DelegatingWebMvcConfiguration.class) public @interface EnableWebMvc { }@EnableWebMvch核心就是導(dǎo)入DelegatingWebMvcConfiguration,這個(gè)東西我點(diǎn)進(jìn)來(lái),他就是我們看的組合邏輯@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);}}他的父類點(diǎn)進(jìn)來(lái),他給我們做基本的配置,RequestMappingHandlerMapping,這父類我們就不看了,那么看他有什么用呢,他怎么把自動(dòng)配置給失效了呢,那你回頭再來(lái)看一下自動(dòng)配置,@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 {有一個(gè)非常重要的一句話,@ConditionalOnMissingBean(WebMvcConfigurationSupport.class),啥叫OnMissingBean,容器中沒(méi)有這個(gè)組件的時(shí)候,接下來(lái)自動(dòng)配置類里面的所有功能,才起效,這個(gè)自動(dòng)配置類才生效,既然容器中沒(méi)有WebMvcConfigurationSupport,而剛才我們@EnableWebMvc,給我們?nèi)萜髦袑?dǎo)了這么一個(gè)組件,這個(gè)組件正是WebMvcConfigurationSupport,也就是說(shuō)一句話,這個(gè)@EnableWebMvc幫我們把這個(gè)組件導(dǎo)進(jìn)來(lái)了,所以自動(dòng)配置類判斷失效了,接下來(lái)就由我們配置了,將WebMvcConfigurationSupport組件導(dǎo)入進(jìn)來(lái)了,導(dǎo)入的這個(gè)組件只是SpringMVC的基本功能,像那些視圖解析器,包括攔截器,都需要自己再來(lái)配置一下,這就是我們使用@EnableWebMvc可以全面接管,用不到SpringBoot的任何自動(dòng)配置,當(dāng)然這樣希望大家更能吸取這種模式,我們?nèi)绾胃腟pringBoot的配置呢,在SpringBoot里邊,又會(huì)有很多很多的類似的Configure,有異步的Configure支持,Configure就是幫我們進(jìn)行配置擴(kuò)展的,在SpringBoot中,會(huì)有非常多的xxxxConfigurer,幫助我們進(jìn)行擴(kuò)展配置,只要遇見(jiàn)他們了,大家多留心

?

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。