重新理解spring框架

在介紹spring一些常見基本概念解析之前,要先對Spring框架做一個基本的認識菊匿。

Spring是一款開源的輕量級JAVA SE/JAVA EE開發(fā)應用框架铅搓,目的是用于簡化企業(yè)級應用框架筐带。

應用程序是由一組相互協(xié)作的對象完成的,在傳統(tǒng)的應用程序開發(fā)中茂装,一個完整的應用是由一組相互協(xié)作的對象組成的,所以在開發(fā)一個應用時怠蹂,除了要開發(fā)業(yè)務邏輯之外,還要關(guān)注如何使用這些對象協(xié)作來完成所需的功能少态,而且要高內(nèi)聚城侧、低耦合。

Spring剛出來的時候就是幫我們解決創(chuàng)建對象和管理對象的依賴關(guān)系况增,還提供通用日志記錄赞庶、性能統(tǒng)計、安全控制澳骤、異常處理等面向切面的能力歧强,還能管理數(shù)據(jù)庫事務,本身也提供了簡單的JDBC實現(xiàn)为肮,提供與第三方框架的集成摊册,與各種JAVA EE 技術(shù)整合,還有自己的web層 Spring MVC框架颊艳。

設(shè)計的初衷

最開始Spring是為了解決企業(yè)級應用開發(fā)的復雜性設(shè)計的茅特,可以簡化開發(fā),為了撅起EJB那種復雜的開發(fā)棋枕。
采取了四種關(guān)鍵策略:
1.基于POJO的輕量級和最小侵入式編程白修。
2.通過依賴注入和面向接口松耦合。
3.通過切面和慣性進行聲明式編程重斑。
4.通過切面和模板減少樣板式代碼兵睛。

而他主要是通過:面向Bean、依賴注入以及面向切面這三種方式來達成的窥浪。

IOC與IOC容器

大家都知道這是 控制反轉(zhuǎn)祖很。 那么我們可以思考下,他反轉(zhuǎn)的是什么呢漾脂?控制什么呢假颇? 一般來說,我們對象的創(chuàng)建都是由客戶端主動創(chuàng)建的來控制的骨稿。在使用了spring之后笨鸡,所有的Bean都會由Spring來創(chuàng)建。
所以叫做控制對象的創(chuàng)建進行反轉(zhuǎn)啊终,由應用程序來創(chuàng)建镜豹,然后new出來以后需要統(tǒng)一管理起來,所以有了IOC容器容器(ConcurentHashMap)來管理蓝牲。

OOP

這個不能算spring的專業(yè)術(shù)語趟脂,他是面向?qū)ο缶幊痰囊馑肌>邆淙筇匦裕悍庋b例衍、繼承昔期、多態(tài)已卸。萬物都是對象,面向?qū)ο缶幊膛鹨唬P(guān)注事物之間的聯(lián)系累澡,而不是行為的實現(xiàn)過程。

BOP:

簡單來說般贼,就是面向Bean進行編程愧哟。 Bean與Bean之間的關(guān)系,不希望每次都認為去管理哼蛆,而是由程序去管理蕊梧。spring就是從Bean的管理開始的。Bean在Spring中作用就像Object對OOP的意義一樣腮介,Spring中沒有Bean也就沒有Spring存在的意義肥矢。Spring提供了IOC容器通過配置文件或者注解的方式來管理對象之間的依賴關(guān)系。

DI技術(shù)

字面翻譯就是動態(tài)注入的意思叠洗。 通俗就是動態(tài)對象賦值甘改,動態(tài)的調(diào)用getter、setter(采用反射的方式)灭抑,他是控制反轉(zhuǎn)實現(xiàn)的一種方式十艾,也叫做依賴注入。

Spring的加載步驟:定位腾节、載入疟羹、注冊、再確定要不要初始化Spring禀倔。

依賴注入的基本概念

Spring設(shè)計的核心 org.springframework.beans包(架構(gòu)核心是 org.springframework.core包),它的設(shè)計目標是與 JavaBean組件一起使用参淫。這個包通常不是由用戶直接使用救湖,而是由服務器將其用作其他多個功能的底層中介。

下一個最高級抽象是 BeanFactory接口涎才,它是工廠設(shè)計模式的實現(xiàn)鞋既,允許通過名稱創(chuàng)建和檢索對象。BeanFactory也可以管理對象之間的關(guān)系耍铜。

BeanFactory 支持兩種對象模型邑闺。

1,單例:模型提供了具有特定名稱的對象的共享實例棕兼,可以在查詢時對其進行檢索陡舅。Singleton 是默認的也是最常用的對象模型。對于無狀態(tài)服務對象很理想伴挚。

2靶衍,原型:模型確保每次檢索都會創(chuàng)建單獨的對象灾炭。在每個用戶都需要自己的對象時,原型模型最適合颅眶。
Bean工廠的概念是 Spring作為IOC容器的基礎(chǔ)蜈出。

AOP面向切面編程


image.png

很多人都說不清楚這個概念,只會說這是面向切面編程涛酗,這個根據(jù)你深入的使用和理解才能深入淺出的解釋出來铡原。這是一種編程思想,它允許程序員對橫切關(guān)注點或橫切典型的職責分界線的行為(例如日志和事務管理)進行模塊化商叹。AOP的核心構(gòu)造是方面(切面)燕刻,它將那些影響多個類的行為封裝到可重用的模塊中。

在典型的面向?qū)ο箝_發(fā)方式中沈自,可能要將日志記錄放在所有方法和java類中酌儒,才能實現(xiàn)日志功能,在AOP方式中枯途,可以反過來將日志服務模塊化忌怎,以聲明的方式將他們應用到日志的組件上。具體使用方式是繼承一個接口去重寫子類的方法酪夷,然后使用添加注解的方式榴啸。

這樣做的優(yōu)勢就是java類不需要知道日志服務的存在,不需要考慮相關(guān)代碼晚岭,所以用AOP編程能夠松耦合鸥印。

spring AOP的功能完全集成到了Spring的事務管理、日志和其他各種特性上下文中坦报。

常用場景有:

Authentication權(quán)限認證库说、Logging日志、Transctions Manager事務片择、Lazy Loading懶加載潜的、Context Process上下文處理、Error Handler錯誤跟蹤字管、Cache緩存等啰挪。

使用AOP主要是能有兩方面的作用:

1.起增強功能。
2.起解耦作用嘲叔,專人干專事亡呵。

總結(jié)起來,就是AOP硫戈,是一種面向切面編程锰什,允許程序員對橫切關(guān)注點的行為(例如日志和事務管理)進行模塊化,核心是切面。典型應用有日志歇由、權(quán)限卵牍、懶加載、事務等功能沦泌。

比如需要對一個業(yè)務服務進行日志記錄糊昙,該服務就是關(guān)注點,切面谢谦,就是一刀下去形成的兩個面释牺,把這兩個面分別關(guān)聯(lián)在關(guān)注點的邊,一邊記錄服務開始執(zhí)行日志回挽,一邊記錄服務成功或失敗原因日志没咙。

再舉個事務管理的實現(xiàn),以下是數(shù)據(jù)庫事務的結(jié)構(gòu)圖千劈,執(zhí)行業(yè)務服務代碼時祭刚,需要開始數(shù)據(jù)庫連接,開啟事務墙牌,然后才執(zhí)行業(yè)務代碼涡驮,在執(zhí)行過程種,若操作失敗了喜滨,則進行事務回滾捉捅,如果成功則提交事務。

織入

意思就是字節(jié)碼重組

增強

就是使用動態(tài)代理的方式去對行為進行增強虽风。

通知(滿足條件回調(diào))

通知(Advice) :“切面”對于某個“連接點”所產(chǎn)生的動作棒口。其中,一個“切面”可以包含多個“Advice”辜膝。

切入點(Pointcut) :匹配連接點的斷言无牵,在AOP 中通知和一個切入點表達式關(guān)聯(lián)。切面中的所有通知所關(guān)注的連接點厂抖,都由切入點表達式來決定合敦。能夠滿足切面規(guī)則的所有入口

目標對象(Target Object) :被一個或者多個切面所通知的對象。例如AServcieImpl 和BServiceImpl验游,當然在實際運行時,Spring AOP 采用代理實現(xiàn)保檐,實際AOP 操作是TargetObject的代理對象耕蝉。

AOP 代理(AOP Proxy) :在Spring AOP 中有兩種代理方式,JDK 動態(tài)代理和CGLIB 代理夜只。默認情況下垒在,TargetObject 實現(xiàn)了接口時,則采用JDK 動態(tài)代理扔亥,例如场躯,AServiceImpl谈为;反之,采用CGLIB代理踢关,例如伞鲫,BServiceImpl。強制使用CGLIB 代理需要將<aop:config>的proxy-target-class屬性設(shè)為true签舞。

通知(Advice)類型:

前置通知(Before advice):在某連接點(JoinPoint)之前執(zhí)行的通知秕脓,但這個通知不能阻止連接點前的執(zhí)行。ApplicationContext 中在<aop:aspect>里面使用<aop:before>元素進行聲明儒搭。例如吠架,TestAspect 中的doBefore 方法。

后置通知(After advice):當某連接點退出的時候執(zhí)行的通知(不論是正常返回還是異常退出)搂鲫。ApplicationContext 中在<aop:aspect>里面使用<aop:after>元素進行聲明傍药。例如,ServiceAspect中的returnAfter 方法魂仍,所以Teser 中調(diào)用UserService.delete 拋出異常時拐辽,returnAfter 方法仍然執(zhí)行。

返回后通知(After return advice):在某連接點正常完成后執(zhí)行的通知蓄诽,不包括拋出異常的情況薛训。ApplicationContext 中在<aop:aspect>里面使用<after-returning>元素進行聲明。

環(huán)繞通知(Around advice):包圍一個連接點的通知仑氛,類似Web 中Servlet 規(guī)范中的Filter 的doFilter 方法乙埃。可以在方法的調(diào)用前后完成自定義的行為锯岖,也可以選擇不執(zhí)行介袜。ApplicationContext中在<aop:aspect>里面使用<aop:around>元素進行聲明。例如出吹,ServiceAspect 中的around 方法遇伞。

拋出異常后通知(After throwing advice):在方法拋出異常退出時執(zhí)行的通知。ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素進行聲明捶牢。例如鸠珠,ServiceAspect 中的returnThrow 方法。注:可以將多個通知應用到一個目標對象上秋麸,即可以將多個切面織入到同一目標對象渐排。

使用Spring AOP 可以基于兩種式,一種是比較方便和強大的注解方式灸蟆,另一種則是中規(guī)中矩的xml配置方式驯耻。

AOP,切面,使用注解的方式可缚,比xml更加精準霎迫,可以定位到方法中具體的參數(shù)。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帘靡,一起剝皮案震驚了整個濱河市知给,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌测柠,老刑警劉巖炼鞠,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轰胁,居然都是意外死亡谒主,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門赃阀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霎肯,“玉大人,你說我怎么就攤上這事榛斯」塾危” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵驮俗,是天一觀的道長懂缕。 經(jīng)常有香客問我,道長王凑,這世上最難降的妖魔是什么搪柑? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮索烹,結(jié)果婚禮上工碾,老公的妹妹穿的比我還像新娘。我一直安慰自己百姓,他們只是感情好渊额,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垒拢,像睡著了一般旬迹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上求类,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天奔垦,我揣著相機與錄音,去河邊找鬼仑嗅。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仓技。 我是一名探鬼主播鸵贬,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼脖捻!你這毒婦竟也來了阔逼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤地沮,失蹤者是張志新(化名)和其女友劉穎嗜浮,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摩疑,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡危融,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了雷袋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吉殃。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖楷怒,靈堂內(nèi)的尸體忽然破棺而出蛋勺,到底是詐尸還是另有隱情,我是刑警寧澤鸠删,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布抱完,位于F島的核電站,受9級特大地震影響刃泡,放射性物質(zhì)發(fā)生泄漏巧娱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一捅僵、第九天 我趴在偏房一處隱蔽的房頂上張望家卖。 院中可真熱鬧,春花似錦庙楚、人聲如沸上荡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酪捡。三九已至,卻和暖如春纳账,著一層夾襖步出監(jiān)牢的瞬間逛薇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工疏虫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留永罚,地道東北人啤呼。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像呢袱,于是被迫代替她去往敵國和親官扣。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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