Spring入門02--AOP(面向切面編程)

一入愧,理解AOP(Aspect-oriented Programming)

  1. 傳統(tǒng)的OOP面向?qū)ο缶幊躺媸蓿肓死^承叫胖,封裝草冈,多態(tài)等概念用來建立對象間的縱向的層次關(guān)系。并不適合定義橫向的關(guān)系瓮增,例如日志代碼怎棱,它分布在所有對象層次中,但是與核心業(yè)務(wù)卻毫無關(guān)系绷跑,這些散布在各處且和核心業(yè)務(wù)無關(guān)的代碼拳恋,導(dǎo)致了大量代碼的重復(fù);
  2. AOP面向切面編程砸捏,它的關(guān)注點就是如何封裝這些被大量使用谬运,卻和核心業(yè)務(wù)無關(guān)的代碼稱一個個模塊,這些模塊即是切面垦藏;AOP把軟件系統(tǒng)分為兩個部分:核心關(guān)注點(核心業(yè)務(wù))和橫切關(guān)注點(切面)梆暖;

二,理解Spring AOP的一些關(guān)鍵詞:

  1. 切面:封裝起來的會被大量復(fù)用掂骏,且和核心業(yè)務(wù)無關(guān)的代碼式廷,通常是一些普通的java類;
  2. 通知:定義了如何去使用這些切面芭挽,通常分為:前置滑废,后置,環(huán)繞袜爪,和異常通知蠕趁;
  3. 目標(biāo)對象:將會應(yīng)用到通知并被代理的對象;
  4. 代理對象:目標(biāo)對象織入切面后創(chuàng)建的對象辛馆;
  5. 切入點:定義對象中的哪些方法將會被攔截并執(zhí)行切面的代碼俺陋;
  6. 織入:將切面應(yīng)用到目標(biāo)對象并產(chǎn)生代理對象的過程豁延;

三,Spring如何實現(xiàn)AOP

  1. 基于ProxyFactoryBean的AOP實現(xiàn):
    這里分別提供四種不同的通知接口:MethodBeforeAdvice(前置通知),MethodAfterAdvice(后置通知),ThrowsAdvice(異常通知),MethodInterceptor(環(huán)繞通知),設(shè)計普通的java類實現(xiàn)接口中的方法腊状,即可編寫切面代碼即可诱咏;然后重新配置一個代理類的bean,將切面織入目標(biāo)對象缴挖,使用這個代理對象即可袋狞;這個方法過于麻煩,就不列出來了映屋;
  2. 基于Schema的AOP實現(xiàn):
    2.1, 定義切面的實現(xiàn)類:
public class AllAdvice
{
  public void myBeforeAdvice(JoinPoint joinPoint)
  {
    System.out.println("前置通知......");
  }
  public void myAfterAdvice(JoinPoint joinPoint)
  {
    System.out.println("后置通知......");
  }
  public void myThrowingAdvice(JoinPoint joinPoint,Exception e)
  {
    System.out.println("異常通知......");
  }
  public void myAroundAdvice(ProceedingJoinPoint joinPoint)
  {
    System.out.println("環(huán)繞通知......");
  }
}

??????2.2, 在配置文件設(shè)置AOP:

  //裝配AllAdvice的實例
  <bean id="allAdvice" class="com.spring.advice.AllAdvice"/>
  //進(jìn)行AOP的配置
  <aop:config>
    <!-- 定義切面 -->
    <aop:aspect id="allAdvice" ref="allAdvice">
      <!-- 定義切入點苟鸯,切入點采用正則表達(dá)式-->
      <aop:pointcut id="show" expression="execution(* com.spring.beans.*(..))" />
      <!--給切入點織入切面-->
      <!-- 指定前置通知 -->
      <aop:before method="myBeforeAdvice" pointcut-ref="show"/>
      <!-- 指定后置通知 -->
      <aop:after-returning method="myAfterAdvice" pointcut-ref="show" throwing="e"/>
      <!-- 指定異常通知 -->
      <aop:after-throwing method="myThrowAdvice" pointcut-ref="show"/>
      <!-- 指定環(huán)繞通知 -->
      <aop:around method="myAroundAdvice" pointcut-ref="show"/>
    </aop:aspect>
  </aop:config>
  1. 基于@AspectJ注解的AOP實現(xiàn):
//定義切面
@Aspect
public class AllAdviceByAspectJ
{
    //定義切入點
    @Pointcut("execution(void com.spring.beans.HelloWorld.show(String))")
    //定義切入點名字
    private void show(){}
    
    @Pointcut("execution(void com.spring.beans.HelloWorld.log(String))")
    private void log(){}
    //前置通知
    @Before("show(),log()")
    public void myBeforeAdvice(JoinPoint joinPoint)
    {
        System.out.println("calling Schema BeforeAdvice......");
        System.out.println(System.currentTimeMillis());
    }
    //后置通知
    @AfterReturning("show()")
    public void myAfterAdvice(JoinPoint joinPoint)
    {
        System.out.println("calling Schema AfterAdvice......");
        System.out.println(System.currentTimeMillis());
    }
    //異常通知
    @AfterThrowing(pointcut="show()",throwing="e")
    public void myThrowsAdvice(JoinPoint joinPoint,Exception e)
    {
        System.out.println("calling Schema ThrowsAdvice......"+e.getMessage());
        System.out.println(System.currentTimeMillis());
    }
    //環(huán)繞通知
    @Around("show()")
    public void myInterceptorAdvice(ProceedingJoinPoint joinPoint) throws Throwable
    {
        System.out.println("calling Schema InterceptorAdvice......");
        System.out.println(System.currentTimeMillis());
        joinPoint.proceed();
    }
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市棚点,隨后出現(xiàn)的幾起案子早处,更是在濱河造成了極大的恐慌,老刑警劉巖瘫析,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砌梆,死亡現(xiàn)場離奇詭異,居然都是意外死亡贬循,警方通過查閱死者的電腦和手機咸包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甘有,“玉大人,你說我怎么就攤上這事葡缰】飨疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵泛释,是天一觀的道長滤愕。 經(jīng)常有香客問我,道長怜校,這世上最難降的妖魔是什么间影? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮茄茁,結(jié)果婚禮上魂贬,老公的妹妹穿的比我還像新娘。我一直安慰自己裙顽,他們只是感情好付燥,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著愈犹,像睡著了一般键科。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天勋颖,我揣著相機與錄音嗦嗡,去河邊找鬼。 笑死饭玲,一個胖子當(dāng)著我的面吹牛侥祭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咱枉,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼卑硫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚕断?” 一聲冷哼從身側(cè)響起欢伏,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亿乳,沒想到半個月后硝拧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡葛假,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年障陶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聊训。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡抱究,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出带斑,到底是詐尸還是另有隱情鼓寺,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布勋磕,位于F島的核電站妈候,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挂滓。R本人自食惡果不足惜苦银,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赶站。 院中可真熱鬧幔虏,春花似錦、人聲如沸贝椿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽团秽。三九已至主胧,卻和暖如春叭首,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背踪栋。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工焙格, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夷都。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓眷唉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親囤官。 傳聞我的和親對象是個殘疾皇子冬阳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

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