Spring AOP的實際應用

      首先,儘管咱們這裏不乏技術牛人,但是爲了照顧剛接觸JAVA沒多久的童鞋,我先來普及Spring AOP是什麼。

 

       AOP其實是對OOP思想的補充和完善。我想大家對OOP都不會陌生,OOP引入"抽象"、"封裝"、"繼承"、"多態"等概念,對萬事萬物進行抽象和封裝,來建立一種對象的層次結構。它強調了一種完整事物的自上而下的關係。但是具體細粒度到每個事物內部,OOP就顯得無能爲力了。

   

       如日誌功能。日誌代碼往往水平地散佈在所有對象層次當
中,卻與它所散佈到的對象的核心功能毫無關係。對於其他很多類似功能,如事務管理、權限控制等也是如此。這導致了大量代碼的重複,而不利於各個模塊的重
用。  

       而AOP技術則恰恰相反,它利用一種稱爲"橫切"的技術,能夠剖解開封裝的對象內部,並將那些影響了多個類並且與具體業務無關的公共行爲 封裝成一個獨立的模塊(稱
爲切面)。更重要的是,它又能以巧奪天功的妙手將這些剖開的切面復原,不留痕跡的融入核心業務邏輯中。這樣,對於日後橫切功能的編輯和重用都能夠帶來極大的方便。  

 

    一個實際工作中遇到的例子,

     我在A環節提交一個表單,給下個B環節來審覈,但是,因爲之前規定,如果在每月15號之後,則不能提交, 我們通常的做法是在提交表單的方法中做這個檢查,

     但是,如果這些不同的提交方法 都要在提交前做檢查,未免太重複了,加重了工作量,也造成代碼的冗餘,所以我們一用到AOP ,對要提交的方法 在具體執行前,做個方法前通知,來檢查是不是滿足規定就好,如果不滿足,則拋出異常,前臺捕獲,不能提交了於是。

 

下面講一個簡單的通過XML文件來對AOP做個實現。

 

      在spring配置文件上配置如下代碼

<bean id="myAdvisor" class="org.qin.yinglian.system.web.CodeAOPTest">
    </bean>
    <aop:config>
        <!-- 切點 -->
        <aop:pointcut  id="servicePointcut" 

            expression="execution(* org.qin.yinglian.basic.service.*.*(..))"  />
        <!-- 切面(切點+通知) -->
        <aop:aspect id="serviceAspect" ref="myAdvisor">
            <!-- 執行的切面方法 -->
            <aop:before method="beforeAdviso" pointcut-ref="servicePointcut" />
        </aop:aspect>
    </aop:config>

 

通知類:

package org.qin.yinglian.system.web;

public class CodeAOPTest {

 // 前置通知
    public void beforeAdvisor() {
       System.out.println("Hello");
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章