spring boot就是一個(gè)大框架里面包含了許許多多的東西姐仅,其中spring就是最核心的內(nèi)容之一,當(dāng)然就包含spring mvc山橄。spring mvc 是只是spring 處理web層請(qǐng)求的一個(gè)模塊怀各。因此他們的關(guān)系大概就是這樣:spring mvc? < spring <springboot。
理清SpringBoot與SpringMVC的關(guān)系
Spring 框架就像一個(gè)家族恳谎,有眾多衍生產(chǎn)品例如 boot芝此、security、jpa等等因痛。但他們的基礎(chǔ)都是Spring 的 ioc和 aop ioc 提供了依賴注入的容器 aop 婚苹,解決了面向橫切面的編程,然后在此兩者的基礎(chǔ)上實(shí)現(xiàn)了其他延伸產(chǎn)品的高級(jí)功能鸵膏。
Spring MVC是基于 Servlet 的一個(gè) MVC 框架 主要解決 WEB 開發(fā)的問(wèn)題膊升,因?yàn)?Spring 的配置非常復(fù)雜,各種XML谭企、 JavaConfig廓译、hin處理起來(lái)比較繁瑣。
于是為了簡(jiǎn)化開發(fā)者的使用债查,從而創(chuàng)造性地推出了Spring boot非区,約定優(yōu)于配置,簡(jiǎn)化了spring的配置流程攀操。
說(shuō)得更簡(jiǎn)便一些:Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應(yīng)用組件院仿。
大家覺(jué)得挺好用,于是按照這種模式搞了一個(gè) MVC框架(一些用Spring 解耦的組件),用開發(fā) web 應(yīng)用( SpringMVC )歹垫。
然后有發(fā)現(xiàn)每次開發(fā)都寫很多樣板代碼剥汤,為了簡(jiǎn)化工作流程,于是開發(fā)出了一些“懶人整合包”(starter)排惨,這套就是 Spring Boot吭敢。
Spring MVC的功能Spring MVC提供了一種輕度耦合的方式來(lái)開發(fā)web應(yīng)用。Spring MVC是Spring的一個(gè)模塊暮芭,式一個(gè)web框架鹿驼。
通過(guò)Dispatcher Servlet, ModelAndView 和 View Resolver,開發(fā)web應(yīng)用變得很容易辕宏。解決的問(wèn)題領(lǐng)域是網(wǎng)站應(yīng)用程序或者服務(wù)開發(fā)——URL路由畜晰、Session、模板引擎瑞筐、靜態(tài)Web資源等等凄鼻。
Spring Boot的功能Spring Boot實(shí)現(xiàn)了自動(dòng)配置,降低了項(xiàng)目搭建的復(fù)雜度聚假。
眾所周知Spring框架需要進(jìn)行大量的配置块蚌,Spring Boot引入自動(dòng)配置的概念,讓項(xiàng)目設(shè)置變得很容易膘格。
Spring Boot本身并不提供Spring框架的核心特性以及擴(kuò)展功能峭范,只是用于快速、敏捷地開發(fā)新一代基于Spring框架的應(yīng)用程序瘪贱。也就是說(shuō)鬼廓,它并不是用來(lái)替代Spring的解決方案庆亡,而是和Spring框架緊密結(jié)合用于提升Spring開發(fā)者體驗(yàn)的工具。
同時(shí)它集成了大量常用的第三方庫(kù)配置(例如Jackson, JDBC, Mongo, Redis, Mail等等),Spring Boot應(yīng)用中這些第三方庫(kù)幾乎可以零配置的開箱即用(out-of-the-box)归苍,大部分的Spring Boot應(yīng)用都只需要非常少量的配置代碼摊求,開發(fā)者能夠更加專注于業(yè)務(wù)邏輯隙轻。
Spring Boot只是承載者庞钢,輔助你簡(jiǎn)化項(xiàng)目搭建過(guò)程的。如果承載的是WEB項(xiàng)目褪尝,使用Spring MVC作為MVC框架闹获,那么工作流程和你上面描述的是完全一樣的,因?yàn)檫@部分工作是Spring MVC做的而不是Spring Boot河哑。對(duì)使用者來(lái)說(shuō)避诽,換用Spring Boot以后,項(xiàng)目初始化方法變了璃谨,配置文件變了沙庐,另外就是不需要單獨(dú)安裝Tomcat這類容器服務(wù)器了鲤妥,maven打出jar包直接跑起來(lái)就是個(gè)網(wǎng)站,但你最核心的業(yè)務(wù)邏輯實(shí)現(xiàn)與業(yè)務(wù)流程實(shí)現(xiàn)沒(méi)有任何變化拱雏。
所以棉安,用最簡(jiǎn)練的語(yǔ)言概括就是:
Spring 是一個(gè)“引擎”;
Spring MVC 是基于Spring的一個(gè) MVC 框架 铸抑;
Spring Boot 是基于Spring4的條件注冊(cè)的一套快速開發(fā)整合包贡耽。
Spring MVC自動(dòng)配置
Spring Boot為Spring MVC提供的auto-configuration適用于大多數(shù)應(yīng)用,并在Spring默認(rèn)功能上添加了以下特性:
1.引入
ContentNegotiatingViewResolver和BeanNameViewResolver?beans鹊汛。
2.對(duì)靜態(tài)資源的支持蒲赂,包括對(duì)WebJars的支持。
3.自動(dòng)注冊(cè)Converter刁憋,GenericConverter滥嘴,F(xiàn)ormatter?beans。
4.對(duì)HttpMessageConverters的支持至耻。
5.自動(dòng)注冊(cè)
MessageCodeResolver氏涩。
6.對(duì)靜態(tài)index.html的支持。
7.對(duì)自定義Favicon的支持有梆。
8.自動(dòng)使用
ConfigurableWebBindingInitializer?bean。
如果保留Spring Boot MVC特性意系,你只需添加其他的MVC配置(攔截器泥耀,格式化處理器,視圖控制器等)蛔添。
你可以添加自己的WebMvcConfigurerAdapter類型的@Configuration類痰催,而不需要注解@EnableWebMvc。如果希望使用自定義的RequestMappingHandlerMapping迎瞧,RequestMappingHandlerAdapter夸溶,或ExceptionHandlerExceptionResolver,你可以聲明一個(gè)WebMvcRegistrationsAdapter實(shí)例提供這些組件凶硅。
如果想全面控制Spring MVC缝裁,你可以添加自己的@Configuration,并使用@EnableWebMvc注解足绅。
HttpMessageConverters
Spring MVC使用HttpMessageConverter接口轉(zhuǎn)換HTTP請(qǐng)求和響應(yīng)捷绑,合適的默認(rèn)配置可以開箱即用,例如對(duì)象自動(dòng)轉(zhuǎn)換為JSON(使用Jackson庫(kù))或XML(如果Jackson XML擴(kuò)展可用氢妈,否則使用JAXB)粹污,字符串默認(rèn)使用UTF-8編碼。
可以使用Spring Boot的HttpMessageConverters類添加或自定義轉(zhuǎn)換類:
importorg.springframework.boot.autoconfigure.web.HttpMessageConverters;
importorg.springframework.context.annotation.*;
importorg.springframework.http.converter.*;
@Configuration
publicclassMyConfiguration{
@Bean
publicHttpMessageConverterscustomConverters(){
HttpMessageConverter?additional?=?...
HttpMessageConverter?another?=?...
returnnewHttpMessageConverters(additional,?another);
}
}
上下文中出現(xiàn)的所有HttpMessageConverter?bean都將添加到converters列表首量,你可以通過(guò)這種方式覆蓋默認(rèn)的轉(zhuǎn)換器列表(converters)壮吩。
自定義JSON序列化器和反序列化器
如果使用Jackson序列化进苍,反序列化JSON數(shù)據(jù),你可能想編寫自己的JsonSerializer和JsonDeserializer類鸭叙。自定義序列化器(serializers)通常通過(guò)Module注冊(cè)到Jackson觉啊,但Spring Boot提供了@JsonComponent注解這一替代方式,它能輕松的將序列化器注冊(cè)為Spring Beans递雀。
MessageCodesResolver
Spring MVC有一個(gè)實(shí)現(xiàn)策略柄延,用于從綁定的errors產(chǎn)生用來(lái)渲染錯(cuò)誤信息的錯(cuò)誤碼:MessageCodesResolver。Spring Boot會(huì)自動(dòng)為你創(chuàng)建該實(shí)現(xiàn)缀程,只要設(shè)置spring.mvc.message-codes-resolver.format
屬性為PREFIX_ERROR_CODE或POSTFIX_ERROR_CODE(具體查看DefaultMessageCodesResolver.Format枚舉值)搜吧。
靜態(tài)內(nèi)容
默認(rèn)情況下,Spring Boot從classpath下的/static(/public杨凑,/resources或/META-INF/resources)文件夾滤奈,或從ServletContext根目錄提供靜態(tài)內(nèi)容。這是通過(guò)Spring MVC的ResourceHttpRequestHandler實(shí)現(xiàn)的撩满,你可以自定義WebMvcConfigurerAdapter并覆寫addResourceHandlers方法來(lái)改變?cè)撔袨椋虞d靜態(tài)文件)蜒程。
在單機(jī)web應(yīng)用中,容器會(huì)啟動(dòng)默認(rèn)的servlet伺帘,并用它加載ServletContext根目錄下的內(nèi)容以響應(yīng)那些Spring不處理的請(qǐng)求昭躺。大多數(shù)情況下這都不會(huì)發(fā)生(除非你修改默認(rèn)的MVC配置),因?yàn)镾pring總能夠通過(guò)DispatcherServlet處理這些請(qǐng)求伪嫁。
你可以設(shè)置spring.resources.staticLocations屬性自定義靜態(tài)資源的位置(配置一系列目錄位置代替默認(rèn)的值)领炫,如果你這樣做,默認(rèn)的歡迎頁(yè)面將從自定義位置加載张咳,所以只要這些路徑中的任何地方有一個(gè)index.html帝洪,它都會(huì)成為應(yīng)用的主頁(yè)。
此外脚猾,除了上述標(biāo)準(zhǔn)的靜態(tài)資源位置葱峡,有個(gè)例外情況是Webjars內(nèi)容。任何在/webjars/**路徑下的資源都將從jar文件中提供龙助,只要它們以Webjars的格式打包砰奕。
注?如果你的應(yīng)用將被打包成jar,那就不要使用src/main/webapp文件夾提鸟。盡管該文件夾是通常的標(biāo)準(zhǔn)格式脆淹,但它僅在打包成war的情況下起作用,在打包成jar時(shí)沽一,多數(shù)構(gòu)建工具都會(huì)默認(rèn)忽略它盖溺。
Spring Boot也支持Spring MVC提供的高級(jí)資源處理特性,可用于清除緩存的靜態(tài)資源或?qū)ebJar使用版本無(wú)感知的URLs铣缠。
如果想使用針對(duì)WebJars版本無(wú)感知的URLs(version agnostic)烘嘱,只需要添加webjars-locator依賴昆禽,然后聲明你的Webjar。以jQuery為例蝇庭,"/webjars/jquery/dist/jquery.min.js"實(shí)際為"/webjars/jquery/x.y.z/dist/jquery.min.js"醉鳖,x.y.z為Webjar的版本。
注?如果使用JBoss哮内,你需要聲明webjars-locator-jboss-vfs依賴而不是webjars-locator盗棵,否則所有的Webjars將解析為404。
以下的配置為所有的靜態(tài)資源提供一種緩存清除(cache busting)方案北发,實(shí)際上是將內(nèi)容hash添加到URLs中纹因,比如<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
注?實(shí)現(xiàn)該功能的是ResourceUrlEncodingFilter,它在模板運(yùn)行期會(huì)重寫資源鏈接琳拨,Thymeleaf瞭恰,Velocity和FreeMarker會(huì)自動(dòng)配置該filter,JSP需要手動(dòng)配置狱庇。其他模板引擎還沒(méi)自動(dòng)支持惊畏,不過(guò)你可以使用ResourceUrlProvider自定義模塊宏或幫助類。
當(dāng)使用比如JavaScript模塊加載器動(dòng)態(tài)加載資源時(shí)密任,重命名文件是不行的颜启,這也是提供其他策略并能結(jié)合使用的原因。下面是一個(gè)"fixed"策略浪讳,在URL中添加一個(gè)靜態(tài)version字符串而不需要改變文件名:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/lib/
spring.resources.chain.strategy.fixed.version=v12
使用以上策略缰盏,JavaScript模塊加載器加載"/js/lib/"下的文件時(shí)會(huì)使用一個(gè)固定的版本策略"/v12/js/lib/mymodule.js",其他資源仍舊使用內(nèi)容hash的方式<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>驻债。查看ResourceProperties獲取更多支持的選項(xiàng)。
歡迎頁(yè)面
Spring Boot支持靜態(tài)和模板歡迎頁(yè)面形葬。它首先index.html在配置的靜態(tài)內(nèi)容位置中查找?文件合呐。如果找不到,則會(huì)查找index模板笙以。如果找到任何一個(gè)淌实,它將自動(dòng)用作應(yīng)用程序的歡迎頁(yè)面。猖腕、
自定義Favicon
Spring Boot?favicon.ico在配置的靜態(tài)內(nèi)容位置和類路徑的根目錄(按此順序)中查找a?拆祈。如果存在這樣的文件,它會(huì)自動(dòng)用作應(yīng)用程序的圖標(biāo)倘感。
路徑匹配和內(nèi)容協(xié)商
Spring MVC可以通過(guò)查看請(qǐng)求路徑并將它匹配到應(yīng)用程序中定義的映射(例如@GetMapping?Controller方法上的注釋)放坏,將傳入的HTTP請(qǐng)求映射到處理程序。
Spring Boot選擇默認(rèn)禁用后綴模式匹配老玛,這意味著請(qǐng)求"GET /projects/spring-boot.json"不會(huì)匹配?@GetMapping("/projects/spring-boot")映射淤年。這被認(rèn)為是Spring MVC應(yīng)用程序的?最佳實(shí)踐钧敞。此功能在過(guò)去對(duì)于沒(méi)有發(fā)送正確的“Accept”請(qǐng)求標(biāo)頭的HTTP客戶端來(lái)說(shuō)非常有用;?我們需要確保將正確的內(nèi)容類型發(fā)送到客戶端。如今麸粮,內(nèi)容協(xié)商更可靠溉苛。
還有其他一些方法可以處理不一致地發(fā)送適當(dāng)?shù)摹敖邮堋闭?qǐng)求標(biāo)頭的HTTP客戶端。我們可以使用查詢參數(shù)來(lái)確保類似的請(qǐng)求"GET /projects/spring-boot?format=json"?將映射到@GetMapping("/projects/spring-boot")以下內(nèi)容弄诲,而不是使用后綴匹配:
spring.mvc.contentnegotiation.favor-parameter?=true
#我們可以更改參數(shù)名稱愚战,默認(rèn)為“格式”:
#spring.mvc.contentnegotiation.parameter-name?=?myparam
#我們還可以通過(guò)以下方式注冊(cè)其他文件擴(kuò)展名/媒體類型:
spring.mvc.contentnegotiation.media-types.markdown?=text/?markdown
如果您了解注意事項(xiàng)并仍然希望應(yīng)用程序使用后綴模式匹配,則需要進(jìn)行以下配置:
spring.mvc.contentnegotiation.favor-path-extension?=true
#您也可以將該功能限制為已知擴(kuò)展
#spring.mvc.pathmatch.use-registered-suffix-pattern?=true
#我們還可以通過(guò)以下方式注冊(cè)其他文件擴(kuò)展名/媒體類型:
#spring.mvc.contentnegotiation.media-types.adoc?=?text?/?asciidoc
ConfigurableWebBindingInitializer
Spring MVC使用WebBindingInitializer為每個(gè)特殊的請(qǐng)求初始化相應(yīng)的WebDataBinder齐遵,如果你創(chuàng)建自己的ConfigurableWebBindingInitializer @Bean寂玲,Spring Boot會(huì)自動(dòng)配置Spring MVC使用它。
模板引擎
正如REST web服務(wù)洛搀,你也可以使用Spring MVC提供動(dòng)態(tài)HTML內(nèi)容敢茁。Spring MVC支持各種各樣的模板技術(shù),包括Velocity, FreeMarker和JSPs留美,很多其他的模板引擎也提供它們自己的Spring MVC集成彰檬。
Spring Boot為以下的模板引擎提供自動(dòng)配置支持:
FreeMarker
Groovy
Thymeleaf
Velocity(1.4已不再支持)
Mustache
注:由于在內(nèi)嵌servlet容器中使用JSPs存在一些已知的限制,所以建議盡量不使用它們谎砾。
使用以上引擎中的任何一種逢倍,并采用默認(rèn)配置,則模塊會(huì)從src/main/resources/templates自動(dòng)加載景图。
注:IntelliJ IDEA根據(jù)你運(yùn)行應(yīng)用的方式會(huì)對(duì)classpath進(jìn)行不同的排序较雕。在IDE里通過(guò)main方法運(yùn)行應(yīng)用,跟從Maven挚币,或Gradle亮蒋,或打包好的jar中運(yùn)行相比會(huì)導(dǎo)致不同的順序,這可能導(dǎo)致Spring Boot不能從classpath下成功地找到模板妆毕。
如果遇到這個(gè)問(wèn)題慎玖,你可以在IDE里重新對(duì)classpath進(jìn)行排序,將模塊的類和資源放到第一位笛粘〕谜或者,你可以配置模塊的前綴為classpath*:/templates/薪前,這樣會(huì)查找classpath下的所有模板目錄润努。
錯(cuò)誤處理
Spring Boot默認(rèn)提供一個(gè)/error映射用來(lái)以合適的方式處理所有的錯(cuò)誤,并將它注冊(cè)為servlet容器中全局的 錯(cuò)誤頁(yè)面示括。對(duì)于機(jī)器客戶端(相對(duì)于瀏覽器而言铺浇,瀏覽器偏重于人的行為),它會(huì)產(chǎn)生一個(gè)具有詳細(xì)錯(cuò)誤垛膝,HTTP狀態(tài)随抠,異常信息的JSON響應(yīng)裁着。
對(duì)于瀏覽器客戶端,它會(huì)產(chǎn)生一個(gè)白色標(biāo)簽樣式(whitelabel)的錯(cuò)誤視圖拱她,該視圖將以HTML格式顯示同樣的數(shù)據(jù)(可以添加一個(gè)解析為'error'的View來(lái)自定義它)二驰。為了完全替換默認(rèn)的行為,你可以實(shí)現(xiàn)ErrorController秉沼,并注冊(cè)一個(gè)該類型的bean定義桶雀,或簡(jiǎn)單地添加一個(gè)ErrorAttributes類型的bean以使用現(xiàn)存的機(jī)制,只是替換顯示的內(nèi)容唬复。
注BasicErrorController可以作為自定義ErrorController的基類矗积,如果你想添加對(duì)新context type的處理(默認(rèn)處理text/html),這會(huì)很有幫助敞咧。
你只需要繼承BasicErrorController棘捣,添加一個(gè)public方法,并注解帶有produces屬性的@RequestMapping休建,然后創(chuàng)建該新類型的bean乍恐。
你也可以定義一個(gè)@ControllerAdvice去自定義某個(gè)特殊controller或exception類型的JSON文檔:
@ControllerAdvice(basePackageClasses?=?FooController.class)
publicclassFooControllerAdviceextendsResponseEntityExceptionHandler{
@ExceptionHandler(YourException.class)
@ResponseBody
ResponseEntity?handleControllerException(HttpServletRequest?request,?Throwable?ex)?{
HttpStatus?status?=?getStatus(request);
returnnewResponseEntity<>(newCustomErrorType(status.value(),?ex.getMessage()),?status);
}
privateHttpStatusgetStatus(HttpServletRequest?request){
Integer?statusCode?=?(Integer)?request.getAttribute("javax.servlet.error.status_code");
if(statusCode?==null)?{
returnHttpStatus.INTERNAL_SERVER_ERROR;
}
returnHttpStatus.valueOf(statusCode);
}
}
在以上示例中,如果跟FooController相同package的某個(gè)controller拋出YourException测砂,一個(gè)CustomerErrorType類型的POJO的json展示將代替ErrorAttributes展示茵烈。
自定義錯(cuò)誤頁(yè)面
如果想為某個(gè)給定的狀態(tài)碼展示一個(gè)自定義的HTML錯(cuò)誤頁(yè)面,你需要將文件添加到/error文件夾下砌些。錯(cuò)誤頁(yè)面既可以是靜態(tài)HTML(比如呜投,任何靜態(tài)資源文件夾下添加的),也可以是使用模板構(gòu)建的存璃,文件名必須是明確的狀態(tài)碼或一系列標(biāo)簽仑荐。
例如,映射404到一個(gè)靜態(tài)HTML文件纵东,你的目錄結(jié)構(gòu)可能如下:
src/
+-?main/
+-?java/
|???+?
+-?resources/
+-public/
+-error/
|???+-404.html
+-?
使用FreeMarker模板映射所有5xx錯(cuò)誤粘招,你需要如下的目錄結(jié)構(gòu):
src/
+-?main/
+-?java/
|???+
+-?resources/
+-?templates/
+-?error/
|???+-?5xx.ftl
+-
對(duì)于更復(fù)雜的映射,你可以添加實(shí)現(xiàn)ErrorViewResolver接口的beans:
publicclassMyErrorViewResolverimplementsErrorViewResolver{
@Override
publicModelAndViewresolveErrorView(HttpServletRequest?request,
HttpStatus?status,?Map?model){
//?Use?the?request?or?status?to?optionally?return?a?ModelAndView
return...
}
}
你也可以使用Spring MVC特性篮迎,比如@ExceptionHandler方法和@ControllerAdvice男图,ErrorController將處理所有未處理的異常示姿。
映射Spring MVC以外的錯(cuò)誤頁(yè)面
對(duì)于不使用Spring MVC的應(yīng)用甜橱,你可以通過(guò)ErrorPageRegistrar接口直接注冊(cè)ErrorPages。該抽象直接工作于底層內(nèi)嵌servlet容器栈戳,即使你沒(méi)有Spring MVC的DispatcherServlet岂傲,它們?nèi)耘f可以工作。
publicclassMyErrorViewResolverimplementsErrorViewResolver{
@Override
publicModelAndViewresolveErrorView(HttpServletRequest?request,
HttpStatus?status,?Map?model){
//?Use?the?request?or?status?to?optionally?return?a?ModelAndView
return...
}
}
@Bean
publicErrorPageRegistrarerrorPageRegistrar(){
returnnewMyErrorPageRegistrar();
}
//?...
privatestaticclassMyErrorPageRegistrarimplementsErrorPageRegistrar{
@Override
publicvoidregisterErrorPages(ErrorPageRegistry?registry){
registry.addErrorPages(newErrorPage(HttpStatus.BAD_REQUEST,"/400"));
}
}
注.如果你注冊(cè)一個(gè)ErrorPage子檀,該頁(yè)面需要被一個(gè)Filter處理(在一些非Spring web框架中很常見镊掖,比如Jersey乃戈,Wicket),那么該Filter需要明確注冊(cè)為一個(gè)ERROR分發(fā)器(dispatcher)亩进,例如:
@Bean
publicFilterRegistrationBeanmyFilter(){
FilterRegistrationBean?registration?=newFilterRegistrationBean();
registration.setFilter(newMyFilter());
...
registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
returnregistration;
}
(默認(rèn)的FilterRegistrationBean不包含ERROR?dispatcher類型)症虑。
WebSphere應(yīng)用服務(wù)器的錯(cuò)誤處理
當(dāng)部署到一個(gè)servlet容器時(shí),Spring Boot通過(guò)它的錯(cuò)誤頁(yè)面過(guò)濾器將帶有錯(cuò)誤狀態(tài)的請(qǐng)求轉(zhuǎn)發(fā)到恰當(dāng)?shù)腻e(cuò)誤頁(yè)面归薛。request只有在response還沒(méi)提交時(shí)才能轉(zhuǎn)發(fā)(forwarded)到正確的錯(cuò)誤頁(yè)面谍憔,而WebSphere應(yīng)用服務(wù)器8.0及后續(xù)版本默認(rèn)情況會(huì)在servlet方法成功執(zhí)行后提交response,你需要設(shè)置com.ibm.ws.webcontainer.invokeFlushAfterService屬性為false來(lái)關(guān)閉該行為主籍。
Spring HATEOAS
如果正在開發(fā)基于超媒體的RESTful API习贫,你可能需要Spring HATEOAS,而Spring Boot會(huì)為其提供自動(dòng)配置千元,這在大多數(shù)應(yīng)用中都運(yùn)作良好苫昌。 自動(dòng)配置取代了@EnableHypermediaSupport,只需注冊(cè)一定數(shù)量的beans就能輕松構(gòu)建基于超媒體的應(yīng)用幸海,這些beans包括LinkDiscoverers(客戶端支持)祟身,ObjectMapper(用于將響應(yīng)編排為想要的形式)。ObjectMapper可以根據(jù)spring.jackson.*屬性或Jackson2ObjectMapperBuilder?bean進(jìn)行自定義涕烧。
通過(guò)注解@EnableHypermediaSupport月而,你可以控制Spring HATEOAS的配置,但這會(huì)禁用上述ObjectMapper的自定義功能议纯。
CORS支持
跨域資源共享(CORS)是一個(gè)大多數(shù)瀏覽器都實(shí)現(xiàn)了的W3C標(biāo)準(zhǔn)父款,它允許你以靈活的方式指定跨域請(qǐng)求如何被授權(quán),而不是采用那些不安全瞻凤,性能低的方式憨攒,比如IFRAME或JSONP。
從4.2版本開始阀参,Spring MVC對(duì)CORS提供開箱即用的支持肝集。不用添加任何特殊配置,只需要在Spring Boot應(yīng)用的controller方法上注解@CrossOrigin蛛壳,并添加CORS配置杏瞻。通過(guò)注冊(cè)一個(gè)自定義addCorsMappings(CorsRegistry)方法的WebMvcConfigurer?bean可以指定全局CORS配置:
@Configuration
publicclassMyConfiguration{
@Bean
publicWebMvcConfigurercorsConfigurer(){
returnnewWebMvcConfigurerAdapter()?{
@Override
publicvoidaddCorsMappings(CorsRegistry?registry){
registry.addMapping("/api/**");
}
};
}
}
PS:如果覺(jué)得我的分享不錯(cuò),歡迎大家隨手點(diǎn)贊衙荐、轉(zhuǎn)發(fā)捞挥。
?推薦↓↓↓
??【16個(gè)技術(shù)公眾號(hào)】都在這里!
涵蓋:程序員大咖忧吟、源碼共讀砌函、程序員共讀、數(shù)據(jù)結(jié)構(gòu)與算法、黑客技術(shù)和網(wǎng)絡(luò)安全讹俊、大數(shù)據(jù)科技垦沉、編程前端、Java仍劈、Python厕倍、Web編程開發(fā)、Android贩疙、iOS開發(fā)绑青、Linux、數(shù)據(jù)庫(kù)研發(fā)屋群、幽默程序員等闸婴。