Spring-AOP @AspectJ切點函數(shù)之@annotation()

@annotation()概述
@annotation表示標(biāo)注了某個注解的所有方法轴合。

下面通過一個實例說明@annotation()的用法总滩。 AnnotationTestAspect定義了一個后置切面增強,該增強將應(yīng)用到標(biāo)注了NeedTest的目標(biāo)方法中蒜危。

實例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
首先我們先自定義一個注解@NeedTest硝训。

如何自定義注解請參考Java-Java5.0注解解讀

package com.xgj.aop.spring.advisor.aspectJ.function;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 
 * 
 * @ClassName: NeedTest
 * 
 * @Description: 自定義注解@NeedTest
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年8月26日 下午11:19:12
 */

// 聲明注解的保留期限
@Retention(RetentionPolicy.RUNTIME)
// 聲明可以使用該注解的目標(biāo)類型
@Target(ElementType.METHOD)
@Documented
public @interface NeedTest {
    // 聲明注解成員
    boolean value() default false;
}

下面我們定義接口 Waiter

package com.xgj.aop.spring.advisor.aspectJ.function;

public interface Waiter {
    public void greetTo(String clientName);

    public void serverTo(String clientName);
}

接口實現(xiàn)類 兩個NaiveWaiter 和 NaughtWaiter

package com.xgj.aop.spring.advisor.aspectJ.function;

public class NaiveWaiter implements Waiter {

    @NeedTest(true)
    @Override
    public void greetTo(String clientName) {
        System.out.println("NaiveWaiter:greet to " + clientName);
    }

    @Override
    public void serverTo(String clientName) {
        System.out.println("NaiveWaiter:server to " + clientName);
    }

    public void smile(String clientName, int times) {
        System.out.println("NaiveWaiter:smile to  " + clientName + " " + times
                + " times");
    }
}
package com.xgj.aop.spring.advisor.aspectJ.function;

public class NaughtWaiter implements Waiter {

    @Override
    public void greetTo(String clientName) {
        System.out.println("NaughtWaiter:greet to " + clientName);
    }

    @NeedTest(true)
    @Override
    public void serverTo(String clientName) {
        System.out.println("NaughtWaiter:server to " + clientName);
    }

    public void joke(String clientName, int times) {
        System.out.println("NaughtyWaiter:play " + times + " jokes to "
                + clientName);
    }
}

我們可以看到 NaiveWaiter#greetTo()方法標(biāo)注了@NeedTest响委, NaughtWaiter#serverTo()也標(biāo)注了@NeedTest,我們的目標(biāo)就是將后置增強織入到這兩個標(biāo)注了@NeedTest的方法中窖梁。

接下來編寫切面的橫切邏輯

package com.xgj.aop.spring.advisor.aspectJ.function.annotationFun;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

/**
 * 
 * 
 * @ClassName: AnnotationTestAspect
 * 
 * @Description: 切面 赘风、 后置增強 ,@annotation表示標(biāo)注了某個注解的所有方法
 * 
 * @author: Mr.Yang
 * 
 * @date: 2017年8月26日 下午11:23:53
 */

@Aspect
public class AnnotationTestAspect {

    @AfterReturning("@annotation(com.xgj.aop.spring.advisor.aspectJ.function.NeedTest)")
    public void needTest() {
        System.out.println("needTest() executed,some logic is here");
    }

}

接下來通過Spring自動應(yīng)用切面,配置文件如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    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">

<!-- 使用基于Schema的aop命名空間進行配置 -->


<!-- 基于@AspectJ切面的驅(qū)動器 -->
<aop:aspectj-autoproxy/>

<!-- 目標(biāo)Bean -->
<bean id="naiveWaiter" class="com.xgj.aop.spring.advisor.aspectJ.function.NaiveWaiter"/>

<bean id="naughtWaiter" class="com.xgj.aop.spring.advisor.aspectJ.function.NaughtWaiter"/>

<!-- 使用了@AspectJ注解的切面類 -->
<bean class="com.xgj.aop.spring.advisor.aspectJ.function.annotationFun.AnnotationTestAspect"/>

</beans>

最后編寫測試代碼:

package com.xgj.aop.spring.advisor.aspectJ.function.annotationFun;

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

import com.xgj.aop.spring.advisor.aspectJ.function.Waiter;

public class AnnotationTestAspcetTest {

    @Test
    public void test() {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "com/xgj/aop/spring/advisor/aspectJ/function/annotationFun/conf-annotation.xml");

        // 必須是接口類型,否則拋類型轉(zhuǎn)換異常
        Waiter waiter = (Waiter) ctx.getBean("naiveWaiter");

        // 因為greetTo標(biāo)注了@NeedTest,因此會被后置增強
        waiter.greetTo("XiaoGongJiang");
        waiter.serverTo("XiaoGongJiang");

        Waiter naughtWaiter = (Waiter) ctx.getBean("naughtWaiter");
        // serverTo標(biāo)注了@NeedTest,因此會被后置增強
        naughtWaiter.serverTo("XiaoGongJiang");
    }
}

運行結(jié)果:

2017-08-27 01:24:22,551 INFO [main] (AbstractApplicationContext.java:583) - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6ac604: startup date [Sun Aug 27 01:24:22 BOT 2017]; root of context hierarchy
2017-08-27 01:24:22,647 INFO [main] (XmlBeanDefinitionReader.java:317) - Loading XML bean definitions from class path resource [com/xgj/aop/spring/advisor/aspectJ/function/annotationFun/conf-annotation.xml]
NaiveWaiter:greet to XiaoGongJiang
needTest() executed,some logic is here
NaiveWaiter:server to XiaoGongJiang
NaughtWaiter:server to XiaoGongJiang
needTest() executed,some logic is here
從輸出結(jié)果中可以看出纵刘,切面被正確的織入到了標(biāo)注有@NeedTest注解的方法中邀窃。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市假哎,隨后出現(xiàn)的幾起案子瞬捕,更是在濱河造成了極大的恐慌,老刑警劉巖舵抹,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件山析,死亡現(xiàn)場離奇詭異,居然都是意外死亡掏父,警方通過查閱死者的電腦和手機笋轨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赊淑,“玉大人爵政,你說我怎么就攤上這事√杖保” “怎么了钾挟?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饱岸。 經(jīng)常有香客問我掺出,道長,這世上最難降的妖魔是什么苫费? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任汤锨,我火速辦了婚禮,結(jié)果婚禮上百框,老公的妹妹穿的比我還像新娘闲礼。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布柬泽。 她就那樣靜靜地躺著慎菲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锨并。 梳的紋絲不亂的頭發(fā)上露该,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機與錄音第煮,去河邊找鬼解幼。 笑死,一個胖子當(dāng)著我的面吹牛空盼,可吹牛的內(nèi)容都是我干的书幕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼揽趾,長吁一口氣:“原來是場噩夢啊……” “哼台汇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起篱瞎,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤苟呐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后俐筋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牵素,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年澄者,在試婚紗的時候發(fā)現(xiàn)自己被綠了笆呆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡粱挡,死狀恐怖赠幕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情询筏,我是刑警寧澤榕堰,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站嫌套,受9級特大地震影響逆屡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踱讨,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一魏蔗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勇蝙,春花似錦沫勿、人聲如沸挨约。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翁锡,卻和暖如春蔓挖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馆衔。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工瘟判, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人角溃。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓拷获,卻偏偏與公主長得像,于是被迫代替她去往敵國和親减细。 傳聞我的和親對象是個殘疾皇子匆瓜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

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