Spring(1)——為什么是Spring?

Spring生態(tài)系統(tǒng)
學(xué)習(xí)重點(diǎn)

1猖辫、Spring是什么

簡(jiǎn)單來(lái)說(shuō)弱卡,Spring就是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。從簡(jiǎn)單性住册、可測(cè)試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益瓮具。

下面是Spring的一些特性荧飞;所有Spring的這些特征都能幫助我們夠編寫(xiě)更干凈、更可管理名党、并且更易于測(cè)試的代碼叹阔。它們也為Spring中的各種模塊提供了基礎(chǔ)支持。

輕量

從大小與開(kāi)銷(xiāo)兩方面而言Spring都是輕量的传睹。此外耳幢,Spring是非侵入式的:使用Spring,我們的類(lèi)還是pojo類(lèi),完全不用繼承和實(shí)現(xiàn)Spring的類(lèi)和接口等睛藻。也就是說(shuō)启上,使用Spring的應(yīng)用中的對(duì)象不依賴(lài)于Spring的特定類(lèi)。

IoC

Spring通過(guò)控制反轉(zhuǎn)技術(shù)促進(jìn)了松耦合店印。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴(lài)的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái)冈在,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴(lài)對(duì)象“凑可以認(rèn)為IoC與JNDI相反——不是我們自己控制對(duì)象從容器中查找依賴(lài)包券,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴(lài)傳遞給它,這就是DI——依賴(lài)注入炫贤。

IOC和DI是從兩個(gè)角度描述同一個(gè)事物:

反轉(zhuǎn)控制——哪些方面的控制被反轉(zhuǎn)了呢溅固?答案是獲得依賴(lài)對(duì)象的過(guò)程被反轉(zhuǎn)了±颊洌控制被反轉(zhuǎn)之后侍郭,獲得依賴(lài)對(duì)象的過(guò)程由自身管理變?yōu)榱擞蒊OC容器主動(dòng)注入,于是“反轉(zhuǎn)控制”有了一個(gè)新的名字俩垃,叫做“依賴(lài)注入”励幼。

依賴(lài)注入——所謂依賴(lài)注入,就是由IOC容器在運(yùn)行期間口柳,動(dòng)態(tài)地將某種依賴(lài)關(guān)系注入到對(duì)象之中苹粟。

AOP

Spring提供了面向切面的編程支持,AOP將與程序業(yè)務(wù)無(wú)關(guān)的內(nèi)容分離提取跃闹,應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已嵌削。它們并不負(fù)責(zé)其它的系統(tǒng)級(jí)關(guān)注點(diǎn),例如日志或事務(wù)支持望艺。AOP將與業(yè)務(wù)無(wú)關(guān)的邏輯橫切進(jìn)真正的邏輯中苛秕。

框架

Spring可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用找默。在Spring中艇劫,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里惩激。Spring也提供了很多基礎(chǔ)功能(事務(wù)管理店煞、持久化框架集成等等),而用戶(hù)就有更多的時(shí)間和精力去開(kāi)發(fā)應(yīng)用邏輯风钻。

Spring的優(yōu)點(diǎn)——為什么要用Spring
  • 借助Spring顷蟀,通過(guò)依賴(lài)注入、AOP應(yīng)用骡技、面向接口編程鸣个,來(lái)降低業(yè)務(wù)組件之間的耦合度,增強(qiáng)系統(tǒng)的擴(kuò)展性。
  • 讓已有的技術(shù)和框架更加易用囤萤。
  • 利用其對(duì)hibernate的SessionFactory昼窗、事務(wù)管理的封裝,更簡(jiǎn)潔的應(yīng)用hibernate阁将。
  • Spring并不完全依賴(lài)于Spring,開(kāi)發(fā)者可自由選用Spring框架的部分或全部
  • 利用AOP思想膏秫,集中處理業(yè)務(wù)邏輯,減少重復(fù)代碼做盅,構(gòu)建優(yōu)雅的解決方案缤削。
  • 低侵入式設(shè)計(jì),代碼污染極低吹榴。

2亭敢、使用IOC容器為什么能夠解耦?

參考:Spring IOC為什么可以實(shí)現(xiàn)解耦

對(duì)象之間的過(guò)高耦合問(wèn)題

在采用面向?qū)ο蠓椒ㄔO(shè)計(jì)的軟件系統(tǒng)中图筹,它的底層實(shí)現(xiàn)都是由N個(gè)對(duì)象組成的帅刀,所有的對(duì)象通過(guò)彼此的合作,最終實(shí)現(xiàn)系統(tǒng)的業(yè)務(wù)邏輯远剩。:

對(duì)象解耦與齒輪咬合的情形類(lèi)似

齒輪組中齒輪之間的嚙合關(guān)系,與軟件系統(tǒng)中對(duì)象之間的耦合關(guān)系非常相似扣溺。對(duì)象之間的耦合關(guān)系是無(wú)法避免的,也是必要的瓜晤,這是協(xié)同工作的基礎(chǔ)∽队啵現(xiàn)在,伴隨著工業(yè)級(jí)應(yīng)用的規(guī)模越來(lái)越龐大痢掠,對(duì)象之間的依賴(lài)關(guān)系也越來(lái)越復(fù)雜驱犹,經(jīng)常會(huì)出現(xiàn)對(duì)象之間的多重依賴(lài)性關(guān)系,因此足画,架構(gòu)師和設(shè)計(jì)師對(duì)于系統(tǒng)的分析和設(shè)計(jì)雄驹,將面臨更大的挑戰(zhàn)。對(duì)象之間耦合度過(guò)高的系統(tǒng)淹辞,必然會(huì)出現(xiàn)牽一發(fā)而動(dòng)全身的情形医舆。

對(duì)象之間解耦嚴(yán)重

耦合關(guān)系不僅會(huì)出現(xiàn)在對(duì)象與對(duì)象之間,也會(huì)出現(xiàn)在軟件系統(tǒng)的各模塊之間象缀,以及軟件系統(tǒng)和硬件系統(tǒng)之間彬向。如何降低系統(tǒng)之間、模塊之間和對(duì)象之間的耦合度攻冷,是軟件工程永遠(yuǎn)追求的目標(biāo)之一。為了解決對(duì)象之間的耦合度過(guò)高的問(wèn)題遍希,軟件專(zhuān)家Michael Mattson提出了IOC理論等曼,用來(lái)實(shí)現(xiàn)對(duì)象之間的“解耦”,目前這個(gè)理論已經(jīng)被成功地應(yīng)用到實(shí)踐當(dāng)中,很多的J2EE項(xiàng)目均采用了IOC框架產(chǎn)品Spring禁谦。

IOC解耦過(guò)程

IOC把復(fù)雜系統(tǒng)分解成相互合作的對(duì)象胁黑,這些對(duì)象類(lèi)通過(guò)封裝以后,內(nèi)部實(shí)現(xiàn)對(duì)外部是透明的州泊,從而降低了解決問(wèn)題的復(fù)雜度丧蘸,而且可以靈活地被重用和擴(kuò)展。IOC理論提出的觀點(diǎn)大體是這樣的:借助于“第三方”實(shí)現(xiàn)具有依賴(lài)關(guān)系的對(duì)象之間的解耦遥皂。

"第三方"——IOC容器

由于引進(jìn)了中間位置的“第三方”力喷,也就是IOC容器,使得A演训、B弟孟、C、D這4個(gè)對(duì)象沒(méi)有了耦合關(guān)系样悟,齒輪之間的傳動(dòng)全部依靠“第三方”了拂募,全部對(duì)象的控制權(quán)全部上繳給“第三方”IOC容器,所以窟她,IOC容器成了整個(gè)系統(tǒng)的關(guān)鍵核心陈症,它起到了一種類(lèi)似“粘合劑”的作用,把系統(tǒng)中的所有對(duì)象粘合在一起發(fā)揮作用震糖,如果沒(méi)有這個(gè)“粘合劑”录肯,對(duì)象與對(duì)象之間會(huì)彼此失去聯(lián)系,這就是有人把IOC容器比喻成“粘合劑”的由來(lái)试伙。

我們?cè)賮?lái)做個(gè)試驗(yàn):把上圖中間的IOC容器拿掉嘁信,然后再來(lái)看看這套系統(tǒng):

拿掉IoC容器后的系統(tǒng)

我們現(xiàn)在看到的畫(huà)面,就是我們要實(shí)現(xiàn)整個(gè)系統(tǒng)所需要完成的全部?jī)?nèi)容疏叨。這時(shí)候潘靖,A、B蚤蔓、C卦溢、D這4個(gè)對(duì)象之間已經(jīng)沒(méi)有了耦合關(guān)系,彼此毫無(wú)聯(lián)系秀又,這樣的話单寂,當(dāng)你在實(shí)現(xiàn)A的時(shí)候,根本無(wú)須再去考慮B吐辙、C和D了宣决,對(duì)象之間的依賴(lài)關(guān)系已經(jīng)降低到了最低程度。所以昏苏,如果真能實(shí)現(xiàn)IOC容器尊沸,對(duì)于系統(tǒng)開(kāi)發(fā)而言威沫,這將是一件多么美好的事情,參與開(kāi)發(fā)的每一成員只要實(shí)現(xiàn)自己的類(lèi)就可以了洼专,跟別人沒(méi)有任何關(guān)系棒掠!

為什么叫“控制反轉(zhuǎn)”

軟件系統(tǒng)在沒(méi)有引入IOC容器之前,對(duì)象A依賴(lài)于對(duì)象B屁商,那么對(duì)象A在初始化或者運(yùn)行到某一點(diǎn)的時(shí)候烟很,自己必須主動(dòng)去創(chuàng)建對(duì)象B或者使用已經(jīng)創(chuàng)建的對(duì)象B。無(wú)論是創(chuàng)建還是使用對(duì)象B蜡镶,控制權(quán)都在自己手上雾袱。
軟件系統(tǒng)在引入IOC容器之后,這種情形就完全改變了帽哑,由于IOC容器的加入谜酒,對(duì)象A與對(duì)象B之間失去了直接聯(lián)系,所以妻枕,當(dāng)對(duì)象A運(yùn)行到需要對(duì)象B的時(shí)候僻族,IOC容器會(huì)主動(dòng)創(chuàng)建一個(gè)對(duì)象B注入到對(duì)象A需要的地方

IOC的別名:依賴(lài)注入(DI)

2004年屡谐,Martin Fowler探討了同一個(gè)問(wèn)題述么,既然IOC是控制反轉(zhuǎn),那么到底是“哪些方面的控制被反轉(zhuǎn)了呢愕掏?”度秘,經(jīng)過(guò)詳細(xì)地分析和論證后,他得出了答案:“獲得依賴(lài)對(duì)象的過(guò)程被反轉(zhuǎn)了”饵撑〗J幔控制被反轉(zhuǎn)之后,獲得依賴(lài)對(duì)象的過(guò)程由自身管理變?yōu)榱擞蒊OC容器主動(dòng)注入滑潘。于是垢乙,他給“控制反轉(zhuǎn)”取了一個(gè)更合適的名字叫做“依賴(lài)注入(Dependency Injection)”。他的這個(gè)答案语卤,實(shí)際上給出了實(shí)現(xiàn)IOC的方法:注入追逮。所謂依賴(lài)注入,就是由IOC容器在運(yùn)行期間粹舵,動(dòng)態(tài)地將某種依賴(lài)關(guān)系注入到對(duì)象之中钮孵。

所以,依賴(lài)注入(DI)和控制反轉(zhuǎn)(IOC)是從不同的角度的描述的同一件事情眼滤,就是指通過(guò)引入IOC容器巴席,利用依賴(lài)關(guān)系注入的方式,實(shí)現(xiàn)對(duì)象之間的解耦诅需。

IOC容器的技術(shù)剖析

IOC中最基本的技術(shù)就是“反射(Reflection)”編程情妖,目前.Net C#睬关、Java和PHP5等語(yǔ)言均支持,其中PHP5的技術(shù)書(shū)籍中毡证,有時(shí)候也被翻譯成“映射”。有關(guān)反射的概念和用法蔫仙,大家應(yīng)該都很清楚料睛,通俗來(lái)講就是根據(jù)給出的類(lèi)名(字符串方式)來(lái)動(dòng)態(tài)地生成對(duì)象。這種編程方式可以讓對(duì)象在生成時(shí)才決定到底是哪一種對(duì)象摇邦。反射的應(yīng)用是很廣泛的恤煞,很多的成熟的框架,比如象Java中的Hibernate施籍、Spring框架居扒,.Net中 NHibernate、Spring.Net框架都是把“反射”做為最基本的技術(shù)手段丑慎。

反射技術(shù)其實(shí)很早就出現(xiàn)了喜喂,但一直被忽略,沒(méi)有被進(jìn)一步的利用竿裂。當(dāng)時(shí)的反射編程方式相對(duì)于正常的對(duì)象生成方式要慢至少得10倍∮裼酰現(xiàn)在的反射技術(shù)經(jīng)過(guò)改良優(yōu)化,已經(jīng)非常成熟腻异,反射方式生成對(duì)象和通常對(duì)象生成方式进副,速度已經(jīng)相差不大了,大約為1-2倍的差距悔常。

我們可以把IOC容器的工作模式看做是工廠模式的升華影斑,可以把IOC容器看作是一個(gè)工廠,這個(gè)工廠里要生產(chǎn)的對(duì)象都在配置文件中給出定義机打,然后利用編程語(yǔ)言的的反射編程矫户,根據(jù)配置文件中給出的類(lèi)名生成相應(yīng)的對(duì)象。從實(shí)現(xiàn)來(lái)看姐帚,IOC是把以前在工廠方法里寫(xiě)死的對(duì)象生成代碼吏垮,改變?yōu)橛膳渲梦募?lái)定義,也就是把工廠和對(duì)象生成這兩者獨(dú)立分隔開(kāi)來(lái)罐旗,目的就是提高靈活性和可維護(hù)性膳汪。

3、理解AOP

參考:Spring AOP 實(shí)現(xiàn)原理

為什么會(huì)有AOP

AOP(Aspect-OrientedProgramming九秀,面向方面編程)遗嗽,可以說(shuō)是OOP(Object-Oriented Programing,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善鼓蜒。OOP引入封裝痹换、繼承和多態(tài)性等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu)征字,用以模擬公共行為的一個(gè)集合。當(dāng)我們需要為分散的對(duì)象引入公共行為的時(shí)候娇豫,OOP則顯得無(wú)能為力匙姜。也就是說(shuō),OOP允許你定義從上到下的關(guān)系冯痢,但并不適合定義從左到右的關(guān)系氮昧。例如日志功能。日志代碼往往水平地散布在所有對(duì)象層次中浦楣,而與它所散布到的對(duì)象的核心功能毫無(wú)關(guān)系袖肥。對(duì)于其他類(lèi)型的代碼,如安全性振劳、異常處理和透明的持續(xù)性也是如此椎组。這種散布在各處的無(wú)關(guān)的代碼被稱(chēng)為橫切(cross-cutting)代碼在OOP設(shè)計(jì)中历恐,它導(dǎo)致了大量代碼的重復(fù)寸癌,而不利于各個(gè)模塊的重用

而AOP技術(shù)則恰恰相反夹供,它利用一種稱(chēng)為“橫切”的技術(shù)灵份,剖解開(kāi)封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類(lèi)的公共行為封裝到一個(gè)可重用模塊哮洽,并將其名為“Aspect”填渠,即方面。所謂“方面”鸟辅,簡(jiǎn)單地說(shuō)氛什,就是將那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái)匪凉,便于減少系統(tǒng)的重復(fù)代碼枪眉,降低模塊間的耦合度,并有利于未來(lái)的可操作性和可維護(hù)性再层。AOP代表的是一個(gè)橫向的關(guān)系贸铜,如果說(shuō)“對(duì)象”是一個(gè)空心的圓柱體,其中封裝的是對(duì)象的屬性和行為聂受;那么面向方面編程的方法蒿秦,就仿佛一把利刃,將這些空心圓柱體剖開(kāi)蛋济,以獲得其內(nèi)部的消息棍鳖。而剖開(kāi)的切面繁莹,也就是所謂的“方面”了及刻。然后它又以巧奪天功的妙手將這些剖開(kāi)的切面復(fù)原拆撼,不留痕跡梦碗。

使用“橫切”技術(shù),AOP把軟件系統(tǒng)分為兩個(gè)部分:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)医瘫。業(yè)務(wù)處理的主要流程是核心關(guān)注點(diǎn)侣肄,與之關(guān)系不大的部分是橫切關(guān)注點(diǎn)。橫切關(guān)注點(diǎn)的一個(gè)特點(diǎn)是醇份,他們經(jīng)常發(fā)生在核心關(guān)注點(diǎn)的多處茫孔,而各處都基本相似。比如權(quán)限認(rèn)證被芳、日志、事務(wù)處理馍悟。Aop 的作用在于分離系統(tǒng)中的各種關(guān)注點(diǎn)畔濒,將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)分離開(kāi)來(lái)。正如Avanade公司的高級(jí)方案構(gòu)架師Adam Magee所說(shuō)锣咒,AOP的核心思想就是“將應(yīng)用程序中的商業(yè)邏輯同對(duì)其提供支持的通用服務(wù)進(jìn)行分離侵状。”

實(shí)現(xiàn)AOP的技術(shù)

主要分為兩大類(lèi):一是采用動(dòng)態(tài)代理技術(shù)毅整,利用截取消息的方式趣兄,對(duì)該消息進(jìn)行裝飾,以取代原有對(duì)象行為的執(zhí)行悼嫉;二是采用靜態(tài)織入的方式艇潭,引入特定的語(yǔ)法創(chuàng)建“方面”,從而使得編譯器可以在編譯期間織入有關(guān)“方面”的代碼戏蔑。

AOP使用場(chǎng)景

AOP用來(lái)封裝橫切關(guān)注點(diǎn)蹋凝,具體可以在下面的場(chǎng)景中使用:

  • Authentication 權(quán)限
  • Caching 緩存
  • Context passing 內(nèi)容傳遞
  • Error handling 錯(cuò)誤處理
  • Lazy loading 懶加載
  • Debugging 調(diào)試
  • logging, tracing, profiling and monitoring 記錄跟蹤 優(yōu)化 校準(zhǔn)
  • Performance optimization 性能優(yōu)化
  • Persistence 持久化
  • Resource pooling 資源池
  • Synchronization 同步
  • Transactions 事務(wù)
AOP相關(guān)概念

方面(Aspect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)實(shí)現(xiàn)可能另外橫切多個(gè)對(duì)象总棵。事務(wù)管理是J2EE應(yīng)用中一個(gè)很好的橫切關(guān)注點(diǎn)例子鳍寂。方面用spring的 Advisor或攔截器實(shí)現(xiàn)。

連接點(diǎn)(Joinpoint): 程序執(zhí)行過(guò)程中明確的點(diǎn)情龄,如方法的調(diào)用或特定的異常被拋出迄汛。

通知(Advice): 在特定的連接點(diǎn),AOP框架執(zhí)行的動(dòng)作骤视。各種類(lèi)型的通知包括“around”鞍爱、“before”和“throws”通知。通知類(lèi)型將在下面討論尚胞。許多AOP框架包括Spring都是以攔截器做通知模型硬霍,維護(hù)一個(gè)“圍繞”連接點(diǎn)的攔截器鏈。Spring中定義了四個(gè)advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice

切入點(diǎn)(Pointcut): 指定一個(gè)通知將被引發(fā)的一系列連接點(diǎn)的集合笼裳。AOP框架必須允許開(kāi)發(fā)者指定切入點(diǎn):例如唯卖,使用正則表達(dá)式粱玲。 Spring定義了Pointcut接口,用來(lái)組合MethodMatcher和ClassFilter拜轨,可以通過(guò)名字很清楚的理解抽减, MethodMatcher是用來(lái)檢查目標(biāo)類(lèi)的方法是否可以被應(yīng)用此通知,而ClassFilter是用來(lái)檢查Pointcut是否應(yīng)該應(yīng)用到目標(biāo)類(lèi)上

引入(Introduction): 添加方法或字段到被通知的類(lèi)橄碾。 Spring允許引入新的接口到任何被通知的對(duì)象卵沉。例如,你可以使用一個(gè)引入使任何對(duì)象實(shí)現(xiàn) IsModified接口法牲,來(lái)簡(jiǎn)化緩存史汗。Spring中要使用Introduction, 可有通過(guò)DelegatingIntroductionInterceptor來(lái)實(shí)現(xiàn)通知,通過(guò)DefaultIntroductionAdvisor來(lái)配置Advice和代理類(lèi)要實(shí)現(xiàn)的接口

目標(biāo)對(duì)象(Target Object): 包含連接點(diǎn)的對(duì)象拒垃。也被稱(chēng)作被通知或被代理對(duì)象停撞。

AOP代理(AOP Proxy): AOP框架創(chuàng)建的對(duì)象,包含通知悼瓮。 在Spring中戈毒,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。

織入(Weaving): 組裝方面來(lái)創(chuàng)建一個(gè)被通知對(duì)象横堡。這可以在編譯時(shí)完成(例如使用AspectJ編譯器)埋市,也可以在運(yùn)行時(shí)完成。Spring和其他純Java AOP框架一樣命贴,在運(yùn)行時(shí)完成織入道宅。

如何使用Spring AOP

可以通過(guò)配置文件或者編程的方式來(lái)使用Spring AOP。

  • 配置可以通過(guò)xml文件來(lái)進(jìn)行套么,大概有四種方式:
    (1)配置ProxyFactoryBean培己,顯式地設(shè)置advisors, advice, target等
    (2)配置AutoProxyCreator,這種方式下胚泌,還是如以前一樣使用定義的bean省咨,但是從容器中獲得的其實(shí)已經(jīng)是代理對(duì)象
    (3)通過(guò)<aop:config>來(lái)配置
    (4)通過(guò)<aop: aspectj-autoproxy>來(lái)配置,使用AspectJ的注解來(lái)標(biāo)識(shí)通知及切入點(diǎn)

  • 也可以直接使用ProxyFactory來(lái)以編程的方式使用Spring AOP玷室,通過(guò)ProxyFactory提供的方法可以設(shè)置target對(duì)象, advisor等相關(guān)配置零蓉,最終通過(guò) getProxy()方法來(lái)獲取代理對(duì)象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市穷缤,隨后出現(xiàn)的幾起案子敌蜂,更是在濱河造成了極大的恐慌,老刑警劉巖津肛,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件章喉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)秸脱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)落包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人摊唇,你說(shuō)我怎么就攤上這事咐蝇。” “怎么了巷查?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵有序,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我岛请,道長(zhǎng)旭寿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任崇败,我火速辦了婚禮许师,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僚匆。我一直安慰自己,他們只是感情好搭幻,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布咧擂。 她就那樣靜靜地躺著,像睡著了一般檀蹋。 火紅的嫁衣襯著肌膚如雪松申。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天俯逾,我揣著相機(jī)與錄音贸桶,去河邊找鬼。 笑死桌肴,一個(gè)胖子當(dāng)著我的面吹牛皇筛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坠七,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼水醋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了彪置?” 一聲冷哼從身側(cè)響起拄踪,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拳魁,沒(méi)想到半個(gè)月后惶桐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年姚糊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贿衍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡叛拷,死狀恐怖舌厨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忿薇,我是刑警寧澤裙椭,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站署浩,受9級(jí)特大地震影響揉燃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜筋栋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一炊汤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弊攘,春花似錦抢腐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至捣域,卻和暖如春啼染,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背焕梅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工迹鹅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贞言。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓斜棚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親该窗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子打肝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 1.1.1 Spring 框架 Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成挪捕。它的成功來(lái)源于理念...
    程序員成長(zhǎng)記閱讀 702評(píng)論 0 0
  • 什么是Spring Spring是一個(gè)開(kāi)源的Java EE開(kāi)發(fā)框架粗梭。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,445評(píng)論 1 133
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)级零,斷路器断医,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • (一)Struts兔簇、Spring、Hibernate硬耍、Mybatis框技術(shù) 1.Struts2.0有幾種標(biāo)簽庫(kù) 【...
    獨(dú)云閱讀 3,233評(píng)論 0 62
  • 是的垄琐,這是一篇打著反雞湯旗號(hào)的雞湯。 但是经柴,這同樣也是一篇關(guān)于三觀的故事狸窘。 不知道從什么時(shí)候開(kāi)始,多喝熱水這句話成...
    wcrystal閱讀 755評(píng)論 0 3