spring專題系列之AOP的理解和分析

今天是五一收假以來的第一天排龄,距離下一周一共還有四天惜互,這周主要是對(duì)Spring的重學(xué)習(xí)吴菠。這四天內(nèi)我將從以下幾個(gè)角度進(jìn)行分析和理解。

(1)AOP的理解和分析

(2)IOC的理解和分析

(3)對(duì)bean的理解和分析

(4)spring配置文件的理解和分析

首先今天對(duì)AOP的理解和分析清寇,對(duì)aop的理解也分開闡述喘漏,對(duì)一個(gè)技術(shù)的思考护蝶,基本上都是從上學(xué)時(shí)候課本闡述一個(gè)新知識(shí)的順序進(jìn)行的。 第一:什么是AOP翩迈?

第二:為什么要引入AOP持灰?或者是AOP解決了什么問題?

第三:如何簡(jiǎn)單的實(shí)現(xiàn)AOP负饲?

第四:AOP對(duì)我們寫代碼時(shí)候的思考和幫助是什么堤魁?

現(xiàn)在,開始對(duì)AOP進(jìn)行闡述绽族,

1 什么是AOP姨涡?

1.1 概念介紹

Spring的使命是簡(jiǎn)化Java代碼開發(fā)衩藤,aop作為Spring的一個(gè)子模塊吧慢,也不例外。

AOP 是 Aspect Oriented Programming(面向切面編程) 的簡(jiǎn)稱赏表,和OOP(面向?qū)ο缶幊蹋┮粯邮且环N編程思想检诗,是對(duì)OOP的一種補(bǔ)充。

如何理解什么是AOP呢瓢剿?以日志為例逢慌,在很多管理系統(tǒng),比如訂單系統(tǒng)间狂、推送系統(tǒng)等等都需要把日志記錄下來攻泼。如果每個(gè)業(yè)務(wù)邏輯里面都寫日志的相關(guān)代碼,那就重復(fù)太多了鉴象。

干脆把日志的相關(guān)邏輯代碼忙菠,統(tǒng)一封裝起來。然后在需要的地方嵌入即可纺弊。AOP也主要就是做嵌入這件事的牛欢。看下面這張圖淆游。

image

新增訂單編輯訂單取消訂單推送訂單日志事務(wù)

AOP旨在將橫切關(guān)注點(diǎn)(crosscutting concern)從業(yè)務(wù)主體邏輯中進(jìn)行剝離傍睹,實(shí)現(xiàn)關(guān)注點(diǎn)分離,以提高程序的模塊化程度(及業(yè)務(wù)模塊只需關(guān)注業(yè)務(wù)邏輯犹菱,無需關(guān)注日志拾稳、安全、事務(wù)等通用邏輯)

上面提到了一些名詞腊脱,比如說访得,切面、關(guān)注點(diǎn)虑椎、橫切等震鹉,下面對(duì)這些名詞進(jìn)行解釋俱笛。

1.2 名詞解釋

  1. AOP有自己的一套術(shù)語,我們必須了解一下這些行話传趾,才能更好地理解AOP迎膜。為了方便大家理解,下面將用課代表收作業(yè)作為例子浆兰。

    1. 通知 (Advice)

      定義了在收作業(yè)前后需要做的事磕仅。常見的通知類型有:before、after簸呈、after-returning榕订、around等。

    2. 連接點(diǎn) (JoinPoint)

      連接點(diǎn)指程序運(yùn)行時(shí)允許插入切面的一個(gè)點(diǎn)蜕便,可以是一個(gè)函數(shù)劫恒、一個(gè)包路徑、一個(gè)類轿腺、或者拋出的異常两嘴。有點(diǎn)類似于可以收作業(yè)的時(shí)間點(diǎn)。

    3. 切點(diǎn)(PointCut)

      切點(diǎn)用于定義切面的位置族壳,也就是捕獲哪些連接點(diǎn)的調(diào)用然后執(zhí)行"通知"的操作(什么地點(diǎn))憔辫。

    4. 切面(Aspect)

      切面是切點(diǎn)和通知的聚合,定義了在哪一個(gè)切點(diǎn)做什么通知仿荆。

    5. 目標(biāo)對(duì)象( Target )

      指被切面織入的對(duì)象贰您。

    6. 引入(Introduction)

      引入允許我們向現(xiàn)有的類添加新方法或?qū)傩浴?/p>

    7. 織入(Weaving)

      織入是把切面應(yīng)用到切點(diǎn)對(duì)應(yīng)的連接點(diǎn)的過程。切面在指定連接點(diǎn)被織入到目標(biāo)對(duì)象中拢操。

具體關(guān)系使用圖形化表示是:

image

2 為什么要引入AOP锦亦?

上面是定義,引入AOP的原因肯定是可以解決目前開發(fā)中存在的某些痛點(diǎn):

(1)目前的開發(fā)當(dāng)中庐冯,相互之間都是模塊化開發(fā)孽亲,使用AOP可以有效的實(shí)現(xiàn)模塊化的思路。

(2)將輔助邏輯(日志展父、安全返劲、監(jiān)控等)從業(yè)務(wù)主體邏輯中進(jìn)行剝離,同步進(jìn)行開發(fā)栖茉。

AOP是一種思想篮绿,這種思想是把一些業(yè)務(wù)邏輯剝離開,然后按照主業(yè)務(wù)邏輯進(jìn)行組合吕漂,最后達(dá)到想要的功能邏輯亲配。

3 如何簡(jiǎn)單的實(shí)現(xiàn)AOP?

3.1 AOP編程思路

本圖是一個(gè)簡(jiǎn)單的思路。

image

明確需求創(chuàng)建切面類定義切點(diǎn)定義通知思考:要在哪個(gè)方法的什么時(shí)候做什么事(方法前吼虎?方法后犬钢? 還是around ?)即選擇哪個(gè)連接點(diǎn)進(jìn)行執(zhí)行通知在切點(diǎn)附近(before?after?) 做什么操作

下面定義一個(gè)日志的簡(jiǎn)單案例,實(shí)現(xiàn)AOP思灰。使用的是原始的注解方式:

3.2 案例實(shí)現(xiàn)AOP

3.2.1 明確需求

在某個(gè)方法上加上@FddLog玷犹,就會(huì)在執(zhí)行這個(gè)方法的前后,自動(dòng)輸出相應(yīng)的信息洒疚。下面以把大象放進(jìn)冰箱為例子進(jìn)行演示:

3.2.2 基本接口和實(shí)現(xiàn)

public interface ElephentToRe{
  public void toRe();
}

實(shí)現(xiàn)類如下:

public class ElephentToReImpl implements ElephentToRe{
  public void toRe() {
    System.out.println("把大象放冰箱");
  }
}

3.2.3 定義切面和通知

public class ElephentToReHelper{
    public void beforeElephentToRe(){
        System.out.println("把冰箱門打開");
    }
    public void afterElephentToRe(){
        System.out.println("把冰箱門關(guān)上");
    }
}

配置就好了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
  <!-- 定義通知內(nèi)容歹颓,也就是切入點(diǎn)執(zhí)行前后需要做的事情 -->
  <bean id="elephentToReHelper" class="com.fdd.bean.ElephentToReHelper"></bean>
  <!-- 定義被代理者 -->
  <bean id="elephentToReImpl" class="com.fdd.bean.ElephentToReImpl"></bean>
  <aop:config>
    <aop:aspect ref="elephentToReHelper">
      <aop:before method="beforeElephentToRe" pointcut="execution(* *.toRe(..))" />
      <aop:after method="afterElephentToRe" pointcut="execution(* *.toRe(..))" />
    </aop:aspect>
  </aop:config>
</beans>

3.2.4 測(cè)試看效果

public class Test {
  public static void main(String[] args){
    @SuppressWarnings("resource")
    ApplicationContext appCtx = new FileSystemXmlApplicationContext("application.xml");
    ElephentToRe elephentToReImpl = (ElephentToRe)appCtx.getBean("elephentToReImpl");
    elephentToReImpl.toRe();
  }
}

上面的這種方法是通過純粹的POJO切面來完成的。實(shí)現(xiàn)方式也比較簡(jiǎn)單油湖。

4 我對(duì)AOP思想的看法

任何新技術(shù)的出現(xiàn)都是為了解決目前開發(fā)中存在的某些痛點(diǎn)巍扛。對(duì)于aop來說,其主要是把一些功能代碼進(jìn)行抽象封裝乏德,和主業(yè)務(wù)邏輯代碼進(jìn)行剝離撤奸。在需要的地方進(jìn)行織入即可。

我的看法是

(1)在平時(shí)開發(fā)代碼的時(shí)候鹅经,完全可以把一些常見的寂呛,常用的功能代碼進(jìn)行封裝怎诫,盡量做到動(dòng)態(tài)配置瘾晃。不同的功能模塊只需要進(jìn)行織入即可。

(2)定義業(yè)務(wù)邏輯的模板幻妓,比如說如果要解決某一個(gè)業(yè)務(wù)功能蹦误,如果頁面類似,可以按照基本的框架進(jìn)行組合肉津,然后使用配置平臺(tái)進(jìn)行可控化配置即可强胰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妹沙,隨后出現(xiàn)的幾起案子偶洋,更是在濱河造成了極大的恐慌,老刑警劉巖距糖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玄窝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悍引,警方通過查閱死者的電腦和手機(jī)恩脂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趣斤,“玉大人俩块,你說我怎么就攤上這事。” “怎么了玉凯?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵势腮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我漫仆,道長(zhǎng)嫉鲸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任歹啼,我火速辦了婚禮玄渗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘狸眼。我一直安慰自己藤树,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布拓萌。 她就那樣靜靜地躺著岁钓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪微王。 梳的紋絲不亂的頭發(fā)上屡限,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音炕倘,去河邊找鬼钧大。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罩旋,可吹牛的內(nèi)容都是我干的啊央。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼涨醋,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瓜饥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起浴骂,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤乓土,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后溯警,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趣苏,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年愧膀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拦键。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡檩淋,死狀恐怖芬为,靈堂內(nèi)的尸體忽然破棺而出萄金,到底是詐尸還是另有隱情,我是刑警寧澤媚朦,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布氧敢,位于F島的核電站,受9級(jí)特大地震影響询张,放射性物質(zhì)發(fā)生泄漏孙乖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一份氧、第九天 我趴在偏房一處隱蔽的房頂上張望唯袄。 院中可真熱鬧,春花似錦蜗帜、人聲如沸恋拷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔬顾。三九已至,卻和暖如春湘捎,著一層夾襖步出監(jiān)牢的瞬間诀豁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工窥妇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舷胜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓秩伞,卻偏偏與公主長(zhǎng)得像逞带,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纱新,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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