探索SpringBoot中的SpringMVC

spring boot就是一個大框架里面包含了許許多多的東西拣宏,其中spring就是最核心的內(nèi)容之一,當(dāng)然就包含spring mvc官脓。spring mvc 是只是spring 處理web層請求的一個模塊识颊。因此他們的關(guān)系大概就是這樣:spring mvc? < spring <springboot。

理清SpringBoot與SpringMVC的關(guān)系

Spring 框架就像一個家族借笙,有眾多衍生產(chǎn)品例如 boot、security较锡、jpa等等业稼。但他們的基礎(chǔ)都是Spring 的 ioc和 aop ioc 提供了依賴注入的容器 aop ,解決了面向橫切面的編程蚂蕴,然后在此兩者的基礎(chǔ)上實現(xiàn)了其他延伸產(chǎn)品的高級功能低散。

Spring MVC是基于 Servlet 的一個 MVC 框架 主要解決 WEB 開發(fā)的問題,因為 Spring 的配置非常復(fù)雜骡楼,各種XML谦纱、 JavaConfig、hin處理起來比較繁瑣君编。

于是為了簡化開發(fā)者的使用,從而創(chuàng)造性地推出了Spring boot川慌,約定優(yōu)于配置吃嘿,簡化了spring的配置流程。


說得更簡便一些:Spring 最初利用“工廠模式”(DI)和“代理模式”(AOP)解耦應(yīng)用組件梦重。

大家覺得挺好用兑燥,于是按照這種模式搞了一個 MVC框架(一些用Spring 解耦的組件),用開發(fā) web 應(yīng)用( SpringMVC )琴拧。

然后有發(fā)現(xiàn)每次開發(fā)都寫很多樣板代碼降瞳,為了簡化工作流程,于是開發(fā)出了一些“懶人整合包”(starter)挣饥,這套就是 Spring Boot。

Spring MVC的功能Spring MVC提供了一種輕度耦合的方式來開發(fā)web應(yīng)用沛膳。Spring MVC是Spring的一個模塊扔枫,式一個web框架。

通過Dispatcher Servlet, ModelAndView 和 View Resolver锹安,開發(fā)web應(yīng)用變得很容易短荐。解決的問題領(lǐng)域是網(wǎng)站應(yīng)用程序或者服務(wù)開發(fā)——URL路由倚舀、Session、模板引擎忍宋、靜態(tài)Web資源等等痕貌。


Spring Boot的功能Spring Boot實現(xiàn)了自動配置,降低了項目搭建的復(fù)雜度糠排。

眾所周知Spring框架需要進(jìn)行大量的配置舵稠,Spring Boot引入自動配置的概念,讓項目設(shè)置變得很容易乳讥。

Spring Boot本身并不提供Spring框架的核心特性以及擴(kuò)展功能柱查,只是用于快速、敏捷地開發(fā)新一代基于Spring框架的應(yīng)用程序云石。也就是說唉工,它并不是用來替代Spring的解決方案,而是和Spring框架緊密結(jié)合用于提升Spring開發(fā)者體驗的工具汹忠。

同時它集成了大量常用的第三方庫配置(例如Jackson, JDBC, Mongo, Redis, Mail等等)淋硝,Spring Boot應(yīng)用中這些第三方庫幾乎可以零配置的開箱即用(out-of-the-box),大部分的Spring Boot應(yīng)用都只需要非常少量的配置代碼宽菜,開發(fā)者能夠更加專注于業(yè)務(wù)邏輯谣膳。Spring Boot只是承載者,輔助你簡化項目搭建過程的铅乡。如果承載的是WEB項目继谚,使用Spring MVC作為MVC框架,那么工作流程和你上面描述的是完全一樣的阵幸,因為這部分工作是Spring MVC做的而不是Spring Boot花履。對使用者來說,換用Spring Boot以后挚赊,項目初始化方法變了诡壁,配置文件變了,另外就是不需要單獨安裝Tomcat這類容器服務(wù)器了荠割,maven打出jar包直接跑起來就是個網(wǎng)站妹卿,但你最核心的業(yè)務(wù)邏輯實現(xiàn)與業(yè)務(wù)流程實現(xiàn)沒有任何變化。

所以蔑鹦,用最簡練的語言概括就是:

Spring 是一個“引擎”夺克;

Spring MVC 是基于Spring的一個 MVC 框架 ;

Spring Boot 是基于Spring4的條件注冊的一套快速開發(fā)整合包嚎朽。


Spring MVC自動配置

Spring Boot為Spring MVC提供的auto-configuration適用于大多數(shù)應(yīng)用懊直,并在Spring默認(rèn)功能上添加了以下特性:

引入ContentNegotiatingViewResolver和BeanNameViewResolver?beans。

對靜態(tài)資源的支持火鼻,包括對WebJars的支持室囊。

自動注冊Converter雕崩,GenericConverter,F(xiàn)ormatter?beans融撞。

對HttpMessageConverters的支持盼铁。

自動注冊MessageCodeResolver。

對靜態(tài)index.html的支持尝偎。

對自定義Favicon的支持饶火。

自動使用ConfigurableWebBindingInitializer?bean。

如果保留Spring Boot MVC特性致扯,你只需添加其他的MVC配置(攔截器肤寝,格式化處理器,視圖控制器等)抖僵。你可以添加自己的WebMvcConfigurerAdapter類型的@Configuration類鲤看,而不需要注解@EnableWebMvc。如果希望使用自定義的RequestMappingHandlerMapping耍群,RequestMappingHandlerAdapter义桂,或ExceptionHandlerExceptionResolver,你可以聲明一個WebMvcRegistrationsAdapter實例提供這些組件蹈垢。

如果想全面控制Spring MVC慷吊,你可以添加自己的@Configuration,并使用@EnableWebMvc注解曹抬。

HttpMessageConverters

Spring MVC使用HttpMessageConverter接口轉(zhuǎn)換HTTP請求和響應(yīng)溉瓶,合適的默認(rèn)配置可以開箱即用,例如對象自動轉(zhuǎn)換為JSON(使用Jackson庫)或XML(如果Jackson XML擴(kuò)展可用谤民,否則使用JAXB)堰酿,字符串默認(rèn)使用UTF-8編碼。

可以使用Spring Boot的HttpMessageConverters類添加或自定義轉(zhuǎn)換類:

import?org.springframework.boot.autoconfigure.web.HttpMessageConverters;

import?org.springframework.context.annotation.*;

import?org.springframework.http.converter.*;

@Configuration

public?class?MyConfiguration?{

????@Bean

????public?HttpMessageConverters?customConverters()?{

????????HttpMessageConverter<?>?additional?=?...

????????HttpMessageConverter<?>?another?=?...

????????return?new?HttpMessageConverters(additional,?another);

????}

}

上下文中出現(xiàn)的所有HttpMessageConverter?bean都將添加到converters列表赖临,你可以通過這種方式覆蓋默認(rèn)的轉(zhuǎn)換器列表(converters)。

自定義JSON序列化器和反序列化器

如果使用Jackson序列化灾锯,反序列化JSON數(shù)據(jù)兢榨,你可能想編寫自己的JsonSerializer和JsonDeserializer類。自定義序列化器(serializers)通常通過Module注冊到Jackson顺饮,但Spring Boot提供了@JsonComponent注解這一替代方式吵聪,它能輕松的將序列化器注冊為Spring Beans。

MessageCodesResolver

Spring MVC有一個實現(xiàn)策略兼雄,用于從綁定的errors產(chǎn)生用來渲染錯誤信息的錯誤碼:MessageCodesResolver吟逝。Spring Boot會自動為你創(chuàng)建該實現(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)容囱井。這是通過Spring MVC的ResourceHttpRequestHandler實現(xiàn)的驹尼,你可以自定義WebMvcConfigurerAdapter并覆寫addResourceHandlers方法來改變該行為(加載靜態(tài)文件)。

在單機(jī)web應(yīng)用中庞呕,容器會啟動默認(rèn)的servlet新翎,并用它加載ServletContext根目錄下的內(nèi)容以響應(yīng)那些Spring不處理的請求。大多數(shù)情況下這都不會發(fā)生(除非你修改默認(rèn)的MVC配置)住练,因為Spring總能夠通過DispatcherServlet處理這些請求地啰。

你可以設(shè)置spring.resources.staticLocations屬性自定義靜態(tài)資源的位置(配置一系列目錄位置代替默認(rèn)的值),如果你這樣做讲逛,默認(rèn)的歡迎頁面將從自定義位置加載亏吝,所以只要這些路徑中的任何地方有一個index.html,它都會成為應(yīng)用的主頁妆绞。

此外顺呕,除了上述標(biāo)準(zhǔn)的靜態(tài)資源位置,有個例外情況是Webjars內(nèi)容括饶。任何在/webjars/**路徑下的資源都將從jar文件中提供株茶,只要它們以Webjars的格式打包。

注?如果你的應(yīng)用將被打包成jar图焰,那就不要使用src/main/webapp文件夾启盛。盡管該文件夾是通常的標(biāo)準(zhǔn)格式,但它僅在打包成war的情況下起作用技羔,在打包成jar時僵闯,多數(shù)構(gòu)建工具都會默認(rèn)忽略它。

Spring Boot也支持Spring MVC提供的高級資源處理特性藤滥,可用于清除緩存的靜態(tài)資源或?qū)ebJar使用版本無感知的URLs鳖粟。

如果想使用針對WebJars版本無感知的URLs(version agnostic),只需要添加webjars-locator依賴拙绊,然后聲明你的Webjar向图。以jQuery為例,"/webjars/jquery/dist/jquery.min.js"實際為"/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)方案,實際上是將內(nèi)容hash添加到URLs中违寞,比如<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>:

spring.resources.chain.strategy.content.enabled=true

spring.resources.chain.strategy.content.paths=/**

注?實現(xiàn)該功能的是ResourceUrlEncodingFilter贞瞒,它在模板運行期會重寫資源鏈接偶房,Thymeleaf,Velocity和FreeMarker會自動配置該filter憔狞,JSP需要手動配置翘县。其他模板引擎還沒自動支持挠蛉,不過你可以使用ResourceUrlProvider自定義模塊宏或幫助類被济。

當(dāng)使用比如JavaScript模塊加載器動態(tài)加載資源時畜号,重命名文件是不行的,這也是提供其他策略并能結(jié)合使用的原因簇抵。下面是一個"fixed"策略庆杜,在URL中添加一個靜態(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/"下的文件時會使用一個固定的版本策略"/v12/js/lib/mymodule.js"碟摆,其他資源仍舊使用內(nèi)容hash的方式<link href="/css/spring-2a2d595e6ed9a0b24f027f2b63b134d6.css"/>晃财。查看ResourceProperties獲取更多支持的選項。

歡迎頁面

Spring Boot支持靜態(tài)和模板歡迎頁面典蜕。它首先index.html在配置的靜態(tài)內(nèi)容位置中查找?文件断盛。如果找不到,則會查找index模板愉舔。如果找到任何一個钢猛,它將自動用作應(yīng)用程序的歡迎頁面。轩缤、

自定義Favicon

Spring Boot?favicon.ico在配置的靜態(tài)內(nèi)容位置和類路徑的根目錄(按此順序)中查找a?命迈。如果存在這樣的文件,它會自動用作應(yīng)用程序的圖標(biāo)火的。

路徑匹配和內(nèi)容協(xié)商

Spring MVC可以通過查看請求路徑并將它匹配到應(yīng)用程序中定義的映射(例如@GetMapping?Controller方法上的注釋)壶愤,將傳入的HTTP請求映射到處理程序。

Spring Boot選擇默認(rèn)禁用后綴模式匹配馏鹤,這意味著請求"GET /projects/spring-boot.json"不會匹配?@GetMapping("/projects/spring-boot")映射征椒。這被認(rèn)為是Spring MVC應(yīng)用程序的?最佳實踐。此功能在過去對于沒有發(fā)送正確的“Accept”請求標(biāo)頭的HTTP客戶端來說非常有用;?我們需要確保將正確的內(nèi)容類型發(fā)送到客戶端湃累。如今勃救,內(nèi)容協(xié)商更可靠。

還有其他一些方法可以處理不一致地發(fā)送適當(dāng)?shù)摹敖邮堋闭埱髽?biāo)頭的HTTP客戶端脱茉。我們可以使用查詢參數(shù)來確保類似的請求"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

#我們還可以通過以下方式注冊其他文件擴(kuò)展名/媒體類型:

spring.mvc.contentnegotiation.media-types.markdown?=?text?/?markdown

如果您了解注意事項并仍然希望應(yīng)用程序使用后綴模式匹配琴许,則需要進(jìn)行以下配置:

spring.mvc.contentnegotiation.favor-path-extension?=?true

#您也可以將該功能限制為已知擴(kuò)展

#spring.mvc.pathmatch.use-registered-suffix-pattern?=?true

#我們還可以通過以下方式注冊其他文件擴(kuò)展名/媒體類型:

#spring.mvc.contentnegotiation.media-types.adoc?=?text?/?asciidoc


ConfigurableWebBindingInitializer

Spring MVC使用WebBindingInitializer為每個特殊的請求初始化相應(yīng)的WebDataBinder,如果你創(chuàng)建自己的ConfigurableWebBindingInitializer @Bean溉躲,Spring Boot會自動配置Spring MVC使用它榜田。

模板引擎

正如REST web服務(wù)益兄,你也可以使用Spring MVC提供動態(tài)HTML內(nèi)容。Spring MVC支持各種各樣的模板技術(shù)箭券,包括Velocity, FreeMarker和JSPs净捅,很多其他的模板引擎也提供它們自己的Spring MVC集成。

Spring Boot為以下的模板引擎提供自動配置支持:

FreeMarker

Groovy

Thymeleaf

Velocity(1.4已不再支持)

Mustache

注:由于在內(nèi)嵌servlet容器中使用JSPs存在一些已知的限制辩块,所以建議盡量不使用它們蛔六。

使用以上引擎中的任何一種,并采用默認(rèn)配置废亭,則模塊會從src/main/resources/templates自動加載国章。

注:IntelliJ IDEA根據(jù)你運行應(yīng)用的方式會對classpath進(jìn)行不同的排序。在IDE里通過main方法運行應(yīng)用豆村,跟從Maven液兽,或Gradle,或打包好的jar中運行相比會導(dǎo)致不同的順序掌动,這可能導(dǎo)致Spring Boot不能從classpath下成功地找到模板四啰。如果遇到這個問題,你可以在IDE里重新對classpath進(jìn)行排序粗恢,將模塊的類和資源放到第一位柑晒。或者适滓,你可以配置模塊的前綴為classpath*:/templates/敦迄,這樣會查找classpath下的所有模板目錄。

錯誤處理

Spring Boot默認(rèn)提供一個/error映射用來以合適的方式處理所有的錯誤凭迹,并將它注冊為servlet容器中全局的 錯誤頁面罚屋。對于機(jī)器客戶端(相對于瀏覽器而言,瀏覽器偏重于人的行為)嗅绸,它會產(chǎn)生一個具有詳細(xì)錯誤脾猛,HTTP狀態(tài),異常信息的JSON響應(yīng)鱼鸠。對于瀏覽器客戶端猛拴,它會產(chǎn)生一個白色標(biāo)簽樣式(whitelabel)的錯誤視圖,該視圖將以HTML格式顯示同樣的數(shù)據(jù)(可以添加一個解析為'error'的View來自定義它)蚀狰。為了完全替換默認(rèn)的行為愉昆,你可以實現(xiàn)ErrorController,并注冊一個該類型的bean定義麻蹋,或簡單地添加一個ErrorAttributes類型的bean以使用現(xiàn)存的機(jī)制跛溉,只是替換顯示的內(nèi)容。

注BasicErrorController可以作為自定義ErrorController的基類,如果你想添加對新context type的處理(默認(rèn)處理text/html)芳室,這會很有幫助专肪。你只需要繼承BasicErrorController,添加一個public方法堪侯,并注解帶有produces屬性的@RequestMapping嚎尤,然后創(chuàng)建該新類型的bean。

你也可以定義一個@ControllerAdvice去自定義某個特殊controller或exception類型的JSON文檔:

@ControllerAdvice(basePackageClasses?=?FooController.class)

public?class?FooControllerAdvice?extends?ResponseEntityExceptionHandler?{

????@ExceptionHandler(YourException.class)

????@ResponseBody

????ResponseEntity<?>?handleControllerException(HttpServletRequest?request,?Throwable?ex)?{

????????HttpStatus?status?=?getStatus(request);

????????return?new?ResponseEntity<>(new?CustomErrorType(status.value(),?ex.getMessage()),?status);

????}

????private?HttpStatus?getStatus(HttpServletRequest?request)?{

????????Integer?statusCode?=?(Integer)?request.getAttribute("javax.servlet.error.status_code");

????????if?(statusCode?==?null)?{

????????????return?HttpStatus.INTERNAL_SERVER_ERROR;

????????}

????????return?HttpStatus.valueOf(statusCode);

????}

}

在以上示例中伍宦,如果跟FooController相同package的某個controller拋出YourException芽死,一個CustomerErrorType類型的POJO的json展示將代替ErrorAttributes展示。

自定義錯誤頁面

如果想為某個給定的狀態(tài)碼展示一個自定義的HTML錯誤頁面次洼,你需要將文件添加到/error文件夾下收奔。錯誤頁面既可以是靜態(tài)HTML(比如,任何靜態(tài)資源文件夾下添加的)滓玖,也可以是使用模板構(gòu)建的坪哄,文件名必須是明確的狀態(tài)碼或一系列標(biāo)簽。

例如势篡,映射404到一個靜態(tài)HTML文件翩肌,你的目錄結(jié)構(gòu)可能如下:

src/

?+-?main/

?????+-?java/

?????|???+?<source?code>

?????+-?resources/

?????????+-?public/

?????????????+-?error/

?????????????|???+-?404.html

?????????????+-?<other?public?assets>

使用FreeMarker模板映射所有5xx錯誤,你需要如下的目錄結(jié)構(gòu):

src/

?+-?main/

?????+-?java/

?????|???+?<source?code>

?????+-?resources/

?????????+-?templates/

?????????????+-?error/

?????????????|???+-?5xx.ftl

?????????????+-?<other?templates>

對于更復(fù)雜的映射禁悠,你可以添加實現(xiàn)ErrorViewResolver接口的beans:

public?class?MyErrorViewResolver?implements?ErrorViewResolver?{

????@Override

????public?ModelAndView?resolveErrorView(HttpServletRequest?request,

????????????HttpStatus?status,?Map<String,?Object>?model)?{

????????//?Use?the?request?or?status?to?optionally?return?a?ModelAndView

????????return?...

????}

}

你也可以使用Spring MVC特性念祭,比如@ExceptionHandler方法和@ControllerAdvice,ErrorController將處理所有未處理的異常碍侦。

映射Spring MVC以外的錯誤頁面

對于不使用Spring MVC的應(yīng)用粱坤,你可以通過ErrorPageRegistrar接口直接注冊ErrorPages。該抽象直接工作于底層內(nèi)嵌servlet容器瓷产,即使你沒有Spring MVC的DispatcherServlet站玄,它們?nèi)耘f可以工作。

@Bean

public?ErrorPageRegistrar?errorPageRegistrar(){

????return?new?MyErrorPageRegistrar();

}

//?...

private?static?class?MyErrorPageRegistrar?implements?ErrorPageRegistrar?{

????@Override

????public?void?registerErrorPages(ErrorPageRegistry?registry)?{

????????registry.addErrorPages(new?ErrorPage(HttpStatus.BAD_REQUEST,?"/400"));

????}

}

注.如果你注冊一個ErrorPage濒旦,該頁面需要被一個Filter處理(在一些非Spring web框架中很常見株旷,比如Jersey,Wicket)尔邓,那么該Filter需要明確注冊為一個ERROR分發(fā)器(dispatcher)晾剖,例如:

@Bean

public?FilterRegistrationBean?myFilter()?{

????FilterRegistrationBean?registration?=?new?FilterRegistrationBean();

????registration.setFilter(new?MyFilter());

????...

????registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));

????return?registration;

}

(默認(rèn)的FilterRegistrationBean不包含ERROR?dispatcher類型)。

WebSphere應(yīng)用服務(wù)器的錯誤處理

當(dāng)部署到一個servlet容器時梯嗽,Spring Boot通過它的錯誤頁面過濾器將帶有錯誤狀態(tài)的請求轉(zhuǎn)發(fā)到恰當(dāng)?shù)腻e誤頁面齿尽。request只有在response還沒提交時才能轉(zhuǎn)發(fā)(forwarded)到正確的錯誤頁面,而WebSphere應(yīng)用服務(wù)器8.0及后續(xù)版本默認(rèn)情況會在servlet方法成功執(zhí)行后提交response灯节,你需要設(shè)置com.ibm.ws.webcontainer.invokeFlushAfterService屬性為false來關(guān)閉該行為循头。

Spring HATEOAS

如果正在開發(fā)基于超媒體的RESTful API缠俺,你可能需要Spring HATEOAS,而Spring Boot會為其提供自動配置贷岸,這在大多數(shù)應(yīng)用中都運作良好。 自動配置取代了@EnableHypermediaSupport磷雇,只需注冊一定數(shù)量的beans就能輕松構(gòu)建基于超媒體的應(yīng)用偿警,這些beans包括LinkDiscoverers(客戶端支持),ObjectMapper(用于將響應(yīng)編排為想要的形式)唯笙。ObjectMapper可以根據(jù)spring.jackson.*屬性或Jackson2ObjectMapperBuilder?bean進(jìn)行自定義螟蒸。

通過注解@EnableHypermediaSupport,你可以控制Spring HATEOAS的配置崩掘,但這會禁用上述ObjectMapper的自定義功能七嫌。

CORS支持

跨域資源共享(CORS)是一個大多數(shù)瀏覽器都實現(xiàn)了的W3C標(biāo)準(zhǔn),它允許你以靈活的方式指定跨域請求如何被授權(quán)苞慢,而不是采用那些不安全诵原,性能低的方式,比如IFRAME或JSONP挽放。

從4.2版本開始绍赛,Spring MVC對CORS提供開箱即用的支持。不用添加任何特殊配置辑畦,只需要在Spring Boot應(yīng)用的controller方法上注解@CrossOrigin吗蚌,并添加CORS配置。通過注冊一個自定義addCorsMappings(CorsRegistry)方法的WebMvcConfigurer?bean可以指定全局CORS配置:

@Configuration

public?class?MyConfiguration?{

????@Bean

????public?WebMvcConfigurer?corsConfigurer()?{

????????return?new?WebMvcConfigurerAdapter()?{

????????????@Override

????????????public?void?addCorsMappings(CorsRegistry?registry)?{

????????????????registry.addMapping("/api/**");

????????????}

????????};

????}

}

相關(guān)視頻鏈接:https://pan.baidu.com/s/13pyAIZFjLNfIimU359BxqQ

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纯出,一起剝皮案震驚了整個濱河市蚯妇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暂筝,老刑警劉巖箩言,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焕襟,居然都是意外死亡分扎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門胧洒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來畏吓,“玉大人,你說我怎么就攤上這事卫漫》票” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵列赎,是天一觀的道長宏悦。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么饼煞? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任源葫,我火速辦了婚禮,結(jié)果婚禮上砖瞧,老公的妹妹穿的比我還像新娘息堂。我一直安慰自己,他們只是感情好块促,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布荣堰。 她就那樣靜靜地躺著,像睡著了一般竭翠。 火紅的嫁衣襯著肌膚如雪振坚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天斋扰,我揣著相機(jī)與錄音渡八,去河邊找鬼。 笑死传货,一個胖子當(dāng)著我的面吹牛呀狼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播损离,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼哥艇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了僻澎?” 一聲冷哼從身側(cè)響起貌踏,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窟勃,沒想到半個月后祖乳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秉氧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年眷昆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汁咏。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡亚斋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攘滩,到底是詐尸還是另有隱情帅刊,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布漂问,位于F島的核電站赖瞒,受9級特大地震影響女揭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜栏饮,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一吧兔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袍嬉,春花似錦境蔼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民逼。三九已至泵殴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拼苍,已是汗流浹背笑诅。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留疮鲫,地道東北人吆你。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像俊犯,于是被迫代替她去往敵國和親妇多。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理燕侠,服務(wù)發(fā)現(xiàn)者祖,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架绢彤,建立于...
    Hsinwong閱讀 22,358評論 1 92
  • SpringMVC原理分析 Spring Boot學(xué)習(xí) 5七问、Hello World探究 1、POM文件 1茫舶、父項目...
    jack_jerry閱讀 1,269評論 0 1
  • 小美好的女主械巡,是那種只允許自己負(fù)能量五分鐘的超級可愛的女孩子! 我之所以喜歡她饶氏,我是因為找到了自己的影子讥耗!媽的! ...
    西鴿閱讀 337評論 0 0