Spring

1. 框架概述

1.1 目的

Spring的主要的目的是簡(jiǎn)化java開發(fā):

  • 基于POJO的輕量級(jí)和最小侵入性編程蚓再;
  • 通過依賴注入和面向接口實(shí)現(xiàn)松耦合拆内;
  • 基于切面和慣例進(jìn)行聲明式編程挽牢;
  • 通過切面和模板減少樣板式代碼

1.2 核心技術(shù)

Spring中核心的功能由控制反轉(zhuǎn)和切面編程實(shí)現(xiàn)。

1.2.1 控制反轉(zhuǎn)IOC

控制反轉(zhuǎn)(Inversion of Control ,Ioc)
所謂控制反轉(zhuǎn)就是應(yīng)用本身不負(fù)責(zé)依賴對(duì)象的創(chuàng)建及維護(hù),依賴對(duì)象的創(chuàng)建及維護(hù)由外部容器來負(fù)責(zé)喷户。這樣控制權(quán)就由應(yīng)用轉(zhuǎn)移到了外部容器,控制權(quán)的轉(zhuǎn)移就是所謂反轉(zhuǎn)访锻。

依賴注入就是指:在運(yùn)行期間褪尝,有外部容器動(dòng)態(tài)地將依賴對(duì)象注入到組件中(構(gòu)造方法和set方法)

使用IOC的優(yōu)勢(shì)是:其降低組件之間的耦合度,實(shí)現(xiàn)軟件各層之間的解耦.

在Spring中實(shí)現(xiàn)依賴注入有xml, javaconfig和annotation三種方式期犬。

1.2.2 AOP

AOP是面向切面的河哑,它使得業(yè)務(wù)邏輯和非業(yè)務(wù)邏輯分離,允許你把遍布應(yīng)用各處的功能分離出來形成可重用的組件龟虎。
常用到的場(chǎng)景: 安全璃谨,日志,緩存等

面向切面編程往往被定義為促使軟件系統(tǒng)實(shí)現(xiàn)關(guān)注點(diǎn)的分離一項(xiàng)技
術(shù)鲤妥。系統(tǒng)由許多不同的組件組成佳吞,每一個(gè)組件各負(fù)責(zé)一塊特定功能。
除了實(shí)現(xiàn)自身核心的功能之外棉安,這些組件還經(jīng)常承擔(dān)著額外的職責(zé)底扳。
諸如日志、事務(wù)管理和安全這樣的系統(tǒng)服務(wù)經(jīng)常融入到自身具有核心
業(yè)務(wù)邏輯的組件中去贡耽,這些系統(tǒng)服務(wù)通常被稱為橫切關(guān)注點(diǎn)衷模,因?yàn)樗?br> 們會(huì)跨越系統(tǒng)的多個(gè)組件

概念:
通知: 即切面的工作。
Spring切面可以應(yīng)用5種類型的通知:

  • 前置通知(Before):在目標(biāo)方法被調(diào)用之前調(diào)用通知功能蒲赂;
  • 后置通知(After):在目標(biāo)方法完成之后調(diào)用通知阱冶,此時(shí)不會(huì)關(guān)
    心方法的輸出是什么;
  • 返回通知(After-returning):在目標(biāo)方法成功執(zhí)行之后調(diào)用通
    知凳宙;
  • 異常通知(After-throwing):在目標(biāo)方法拋出異常后調(diào)用通知熙揍;
  • 環(huán)繞通知(Around):通知包裹了被通知的方法,在被通知的方
    法調(diào)用之前和調(diào)用之后執(zhí)行自定義的行為氏涩。
    切點(diǎn): 定義了在何處執(zhí)行通知
    切面:切面是通知和切點(diǎn)的結(jié)合届囚。通知和切點(diǎn)共同定義了切面的全部內(nèi)容
    ——它是什么有梆,在何時(shí)和何處完成其功能
    織入(Weaving)
    織入是把切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建新的代理對(duì)象的過程。切面在指
    定的連接點(diǎn)被織入到目標(biāo)對(duì)象中意系。在目標(biāo)對(duì)象的生命周期里有多個(gè)點(diǎn)
    可以進(jìn)行織入:
  • 編譯期:切面在目標(biāo)類編譯時(shí)被織入泥耀。這種方式需要特殊的編譯
    器。AspectJ的織入編譯器就是以這種方式織入切面的蛔添。
  • 類加載期:切面在目標(biāo)類加載到JVM時(shí)被織入痰催。這種方式需要特
    殊的類加載器(ClassLoader),它可以在目標(biāo)類被引入應(yīng)用
    之前增強(qiáng)該目標(biāo)類的字節(jié)碼迎瞧。AspectJ 5的加載時(shí)織入(load-time
    weaving夸溶,LTW)就支持以這種方式織入切面。
  • 運(yùn)行期:切面在應(yīng)用運(yùn)行的某個(gè)時(shí)刻被織入凶硅。一般情況下缝裁,在織
    入切面時(shí),AOP容器會(huì)為目標(biāo)對(duì)象動(dòng)態(tài)地創(chuàng)建一個(gè)代理對(duì)象足绅。
    Spring AOP就是以這種方式織入切面的捷绑。

1.2.2 使用

  • 編寫切點(diǎn)
    如下: 其展現(xiàn)了一個(gè)切點(diǎn)表達(dá)式,這個(gè)表達(dá)式能夠設(shè)置黨perform方法執(zhí)行時(shí)觸發(fā)通知氢妈。


    Paste_Image.png
  • 編寫切面:
    實(shí)現(xiàn)切面的通知之后粹污,然后在通知中添加相應(yīng)的切點(diǎn)信息即可實(shí)現(xiàn)切面的定義。

@Pointcut("execution(** concert.Performance.perform(..))")
public void performance() {}

@Before("performance()")
public void silenceCellPhones() {
    System.out.println("Silencing cell phones");
}

1.3 容器

之前的servlet中容器負(fù)責(zé)servlet的生成首量,調(diào)用和銷毀的過程壮吩。在基于Spring的應(yīng)用中,你的應(yīng)用對(duì)象生存于Spring容器(container)中蕾总,Spring容器負(fù)責(zé)創(chuàng)建對(duì)象粥航,裝配它們,配置它們并管理它們的整個(gè)生命周期生百,從生存到死亡(在這里递雀,可能就是new到finalize())。

Spring容器并不是只有一個(gè)蚀浆。Spring自帶了多個(gè)容器實(shí)現(xiàn)缀程,可以歸為
兩種不同的類型。

  • bean工廠(由org.springframework. beans.factory.eanFactory接口定義)是最簡(jiǎn)單的容器市俊,提供基本的DI支持杨凑。
  • 應(yīng)用上下文(org.springframework.context.ApplicationContext接口定義)基于BeanFactory構(gòu)建,并提供應(yīng)用框架級(jí)別的服務(wù)摆昧,例如從屬性文件解析文本信息以及發(fā)布應(yīng)用事件給感興趣的事件監(jiān)聽者撩满。

spring提供的應(yīng)用上下文(最可能遇到的):

  • AnnotationConfigApplicationContext:從一個(gè)或多個(gè)基于Java的配置類中加載Spring應(yīng)用上下文。
  • AnnotationConfigWebApplicationContext:從一個(gè)或多個(gè)基于Java的配置類中加載Spring Web應(yīng)用上下文。
  • ClassPathXmlApplicationContext:從類路徑下的一個(gè)或
    多個(gè)XML配置文件中加載上下文定義伺帘,把應(yīng)用上下文的定義文件
    作為類資源昭躺。
  • FileSystemXmlapplicationcontext:從文件系統(tǒng)下的一個(gè)或多個(gè)XML配置文件中加載上下文定義。
  • XmlWebApplicationContext:從Web應(yīng)用下的一個(gè)或多個(gè)XML配置文件中加載上下文定義伪嫁。

1.4 整體

Spring框架整體包括了核心容器部分领炫,AOP模塊部分,數(shù)據(jù)集成與訪問张咳,web與遠(yuǎn)程調(diào)用帝洪。
如圖所示:


Paste_Image.png

2. Spring web

在先前的servlet的課程中,代碼出現(xiàn)的問題:

  • 不管servlet還是jsp都將java代碼和視圖代碼在不同程度上耦合在一起了脚猾。
  • 不能很好的與RESTful API 進(jìn)行結(jié)合葱峡。例如請(qǐng)求地址為:user/{userId}

Spring MVC

Spring MVC 是spring相關(guān)的web框架項(xiàng)目。其整體的工作流程和機(jī)制可以用下圖表示:


Paste_Image.png

DispatcherServlet是Spring MVC的核心龙助,其將請(qǐng)求轉(zhuǎn)發(fā)給合適的控制器族沃。
對(duì)于DispatcherServlet的配置和普通的servlet的配置相同,只不過此時(shí)DispatcherServlet是由spring中實(shí)現(xiàn)好的泌参。

編寫控制器

控制器邏輯上屬于控制處理業(yè)務(wù)邏輯部分,在Spring中以bean的形式出現(xiàn)常空。所以可以使用@Controller注解來標(biāo)注該控制器沽一。

@Controller
public class HomeController {
    @RequestMapping(value="/", method=GET)
        public String home() {
        return "home";
        }
}

注意點(diǎn):

  • RequestMapping中的value定義了該控制其可以處理的url地址,復(fù)雜的可以用正則表達(dá)式書寫漓糙。method表示可以處理的請(qǐng)求必須滿足的方法铣缠。 其他屬性可以參考
  • RequestMapping可以定義在類級(jí)別
  • 函數(shù)的參數(shù)可以是下面的任何一種:
Paste_Image.png
  • 函數(shù)的返回值可以是下面的任何一種。
    • void
    • string: view名稱
    • HttpEntity
    • View
    • Map
    • Model
    • ModelAndView

ViewResolver

spring框架中ViewResolver負(fù)責(zé)視圖的解析工作昆禽,ViewResolver的整體的框架如下:(注:實(shí)現(xiàn)的ViewResolver未標(biāo)注完)


Paste_Image.png

不同的視圖解析器區(qū)別主要在于:面向的視圖資源不同蝗蛙。

  • InternalResourceViewResolver : 將視圖解析為Web應(yīng)用的內(nèi)部資源(一般為
    JSP)
  • FreeMarkerViewResolver : 將視圖解析為FreeMarker模板
  • ContentNegotiatingViewResolver: 通過考慮客戶端需要的內(nèi)容類型來解析視圖,委托給另外一個(gè)能夠產(chǎn)生對(duì)應(yīng)內(nèi)容類型的視圖解析器.

使用視圖解析器時(shí)需要對(duì)其進(jìn)行配置醉鳖,如下:

<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

對(duì)于home視圖將被解析為:/WEB-INF/jsp/home.jsp

參考:

  1. 《spring in action》
  2. http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#unit-testing-spring-mvc
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捡硅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盗棵,更是在濱河造成了極大的恐慌壮韭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹因,死亡現(xiàn)場(chǎng)離奇詭異喷屋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞭恰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門屯曹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事恶耽∶苋危” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵驳棱,是天一觀的道長批什。 經(jīng)常有香客問我,道長社搅,這世上最難降的妖魔是什么驻债? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮形葬,結(jié)果婚禮上合呐,老公的妹妹穿的比我還像新娘。我一直安慰自己笙以,他們只是感情好淌实,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猖腕,像睡著了一般拆祈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上倘感,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天放坏,我揣著相機(jī)與錄音,去河邊找鬼老玛。 笑死淤年,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蜡豹。 我是一名探鬼主播麸粮,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼镜廉!你這毒婦竟也來了弄诲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤娇唯,失蹤者是張志新(化名)和其女友劉穎威根,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體视乐,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛搀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佑淀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片留美。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谎砾,到底是詐尸還是另有隱情逢倍,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布景图,位于F島的核電站较雕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏挚币。R本人自食惡果不足惜亮蒋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妆毕。 院中可真熱鬧慎玖,春花似錦、人聲如沸笛粘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薪前。三九已至润努,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間示括,已是汗流浹背任连。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留例诀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓裁着,卻偏偏與公主長得像繁涂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子二驰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理扔罪,服務(wù)發(fā)現(xiàn),斷路器桶雀,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 什么是Spring Spring是一個(gè)開源的Java EE開發(fā)框架矿酵。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,462評(píng)論 1 133
  • 我不想停留 不想等待 渴望流浪 是什么阻止我的步伐 讓我困在此地 放下所有 尋覓天堂 虔心流浪
    不入流echo閱讀 84評(píng)論 0 2
  • 1 婚前棘捣,覺得他打鼾的聲音特別好玩辜腺,特別錄音,還寫了長長的情書作為禮物送給了他。 婚后评疗,啊测砂,怎么打鼾了,而且鼾聲如...
    7日晗閱讀 359評(píng)論 0 4