4.4 基于XML配置開發(fā)AspectJ

AspectJ是一個基于Java語言的Aop框架佛舱。從Spring2.0 以后引入了AspectJ的支持样漆。目前的Spring框架出皇,建議開發(fā)者使用AspectJ實現(xiàn)Spring Aop 裆蒸。使用AspectJ實現(xiàn)Spring Aop的方式有兩種:一種是基于XML配置開發(fā)AspectJ分井,另一種是基于注解開發(fā)AspectJ。
基于XML配置開發(fā)AspectJ是指通過XML配置文件定義切面门躯、切入點及通知淆党,所有這些定義都必須在<aop:config>元素內(nèi)。
下面通過一個實例演示基于XML配置開發(fā)AspectJ的過程

目錄結(jié)構(gòu)

img

1.導(dǎo)入AspectJ框架相關(guān)的jar包

需要再像ch4應(yīng)用的/WEB-INF/lib目錄下導(dǎo)入jar包spring-aspect-5.0.2.RELEASE.jar和aspectjweaver-1.8.13.jar 生音。spring-aspect-5.0.2.RELEASE.jar是Spring為Aspect提供的實現(xiàn),Spring的包中已提供窒升。
aspectjweaver-1.8.13.jar是Aspect框架所提供的規(guī)范包

2.創(chuàng)建切面類

在ch4應(yīng)用的src目錄下缀遍,創(chuàng)建aspectj.xml包,在該包中創(chuàng)建切面類MyAspect饱须,并在類中編寫各種類型通知域醇。

MyAspect.java

package aspectj.xml;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

/*
 * 切面類,在次類中編寫各種類型通知
 */
public class MyAspect {
    /**
     * 前置通知,使用Joinpoint接口作為參數(shù)獲得目標(biāo)對象信息
     */
    public void before(JoinPoint jp) {
        System.out.println("前置通知:模擬權(quán)限控制");
        System.out.println(".目標(biāo)對象:模擬權(quán)限控制" + jp.getTarget()
                            + ".被增強處理的方法:" + jp.getSignature().getName());  
    }
    /**
     * 后置返回通知
     */
    public void afterReturning(JoinPoint jp) {
        System.out.println("后置返回通知:" + "模擬刪除臨時文件");
        System.out.println(".被增強的處理方法" + jp.getSignature().getName());
    }
    /**
     * 環(huán)繞通知
     * ProceedingJoinPoint子接口譬挚,代表可以執(zhí)行的目標(biāo)方法
     * 返回類型必須是Object
     * 必須一個參數(shù)是ProceedingJoinPoint類型
     * 必須是throws Throwable
     */
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        //開始
        System.out.println("環(huán)繞開始:執(zhí)行目標(biāo)方法前锅铅,模擬開始事務(wù)");
        //執(zhí)行當(dāng)前目標(biāo)方法
        Object obj = pjp.proceed();
        //結(jié)束
        System.out.println("環(huán)繞結(jié)束:執(zhí)行目標(biāo)方法后,模擬關(guān)閉事務(wù)");
        return obj;
    }
    /**
     * 異常通知
     */
    public void except(Throwable e) {
        System.out.println("異常通知:" + "程序執(zhí)行異常" + e.getMessage());
    }
    /**
     * 后置(最終)通知
     */
    public void after() {
        System.out.println("最終通知:模擬釋放資源");
    }
}

3.創(chuàng)建配置文件减宣,并編寫相關(guān)配置

在aspect.xml包中盐须,創(chuàng)建配置文件applicationContext.xml,并在<aop:config>元素以及其子元素編寫相關(guān)配置

applicationContext.xml

<?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.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd"> 
<!-- 定義目標(biāo)對象(使用4.2.1節(jié)中的實現(xiàn)類) -->
<bean id="testDao" class="dynamic.jdk.TestDaoImpl"/>
<!-- 定義切面 -->
<bean id="myAspect" class="aspectj.xml.MyAspect"/>
<!-- AOP配置 -->
<aop:config>
<!-- 配置切面 -->
<aop:aspect ref="myAspect">
    <!-- 配置切入點漆腌,通知增強哪些方法 -->
    <aop:pointcut expression="execution(* dynamic.jdk.*.*(..))" id="myPointCut"/>
    <!-- 將通知與切入點關(guān)聯(lián) -->
    <!-- 關(guān)聯(lián)前置通知 -->
    <aop:before method="before" pointcut-ref="myPointCut"/>
    <!-- 關(guān)聯(lián)后置返回通知贼邓,在目標(biāo)方法成功執(zhí)行后執(zhí)行 -->
    <aop:after-returning method="afterReturning" pointcut-ref="myPointCut"/>
    <!-- 關(guān)聯(lián)環(huán)繞通知 -->
    <aop:around method="around" pointcut-ref="myPointCut"/>
    <!-- 關(guān)聯(lián)異常通知,沒有異常發(fā)生時將不會執(zhí)行增強闷尿,throwing屬性設(shè)置通知的第二個參數(shù)名稱 -->
    <aop:after-throwing method="except" pointcut-ref="myPointCut" throwing="e"/>
    <!-- 關(guān)聯(lián)后置(最終)塑径,不管目標(biāo)方法是否成功都要執(zhí)行 -->
    <aop:after method="after" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>

</beans>

4.創(chuàng)建測試類

在aspectj.xml包中,創(chuàng)建測試類XMLAspectTest填具,在主方法中使用Spring容器獲取代理對象统舀,并執(zhí)行目標(biāo)方法。


img

XMLAspectTest.java

package aspectj.xml;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import dynamic.jdk.TestDao;

public class XMLAspectJTest {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ApplicationContext appCon = new ClassPathXmlApplicationContext("/aspectj/xml/applicationContext.xml");
        //從容器中獲取增強后的目標(biāo)對象
        TestDao testDaoAdvice = (TestDao)appCon.getBean("testDao");
        //執(zhí)行方法
        testDaoAdvice.save();

    }

}

運行結(jié)果

img

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劳景,一起剝皮案震驚了整個濱河市誉简,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枢泰,老刑警劉巖描融,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衡蚂,居然都是意外死亡窿克,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門毛甲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來年叮,“玉大人,你說我怎么就攤上這事玻募≈凰穑” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵七咧,是天一觀的道長跃惫。 經(jīng)常有香客問我,道長艾栋,這世上最難降的妖魔是什么爆存? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮蝗砾,結(jié)果婚禮上先较,老公的妹妹穿的比我還像新娘携冤。我一直安慰自己,他們只是感情好闲勺,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布曾棕。 她就那樣靜靜地躺著,像睡著了一般菜循。 火紅的嫁衣襯著肌膚如雪翘地。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天债朵,我揣著相機與錄音子眶,去河邊找鬼。 笑死序芦,一個胖子當(dāng)著我的面吹牛臭杰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谚中,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼渴杆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宪塔?” 一聲冷哼從身側(cè)響起磁奖,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎某筐,沒想到半個月后比搭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡南誊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年身诺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抄囚。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡霉赡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幔托,到底是詐尸還是另有隱情穴亏,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布重挑,位于F島的核電站嗓化,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谬哀。R本人自食惡果不足惜刺覆,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玻粪。 院中可真熱鬧隅津,春花似錦、人聲如沸劲室。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽很洋。三九已至充蓝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喉磁,已是汗流浹背谓苟。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留协怒,地道東北人涝焙。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像孕暇,于是被迫代替她去往敵國和親仑撞。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

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