Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法
@annotation()概述
@annotation表示標(biāo)注了某個(gè)注解的所有方法。
下面通過一個(gè)實(shí)例說明@annotation()的用法。 AnnotationTestAspect定義了一個(gè)后置切面增強(qiáng),該增強(qiáng)將應(yīng)用到標(biāo)注了NeedTest的目標(biāo)方法中。
實(shí)例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster

首先我們先自定義一個(gè)注解@NeedTest。
如何自定義注解請(qǐng)參考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);
}
接口實(shí)現(xiàn)類 兩個(gè)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)就是將后置增強(qiáng)織入到這兩個(gè)標(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: 切面 、 后置增強(qiáng) ,@annotation表示標(biāo)注了某個(gè)注解的所有方法
*
* @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自動(dòng)應(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命名空間進(jìn)行配置 --> <!-- 基于@AspectJ切面的驅(qū)動(dòng)器 --> <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>
最后編寫測(cè)試代碼:
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");
// 因?yàn)間reetTo標(biāo)注了@NeedTest,因此會(huì)被后置增強(qiáng)
waiter.greetTo("XiaoGongJiang");
waiter.serverTo("XiaoGongJiang");
Waiter naughtWaiter = (Waiter) ctx.getBean("naughtWaiter");
// serverTo標(biāo)注了@NeedTest,因此會(huì)被后置增強(qiáng)
naughtWaiter.serverTo("XiaoGongJiang");
}
}
運(yùn)行結(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注解的方法中。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringAOP切點(diǎn)函數(shù)實(shí)現(xiàn)原理詳解
- Spring AOP中定義切點(diǎn)的實(shí)現(xiàn)方法示例
- Spring AOP如何在注解上使用SPEL表達(dá)式注入對(duì)象
- SpringBoot?AOP?@Pointcut切入點(diǎn)表達(dá)式排除某些類方式
- SpringAop切入點(diǎn)execution表達(dá)式的深入講解
- Spring-AOP 靜態(tài)正則表達(dá)式方法如何匹配切面
- spring aop execution表達(dá)式的用法
- Spring AOP中使用args表達(dá)式的方法示例
- Spring中AOP的切點(diǎn)、通知、切點(diǎn)表達(dá)式及知識(shí)要點(diǎn)整理
相關(guān)文章
Java之Scanner.nextLine()讀取回車的問題及解決
這篇文章主要介紹了Java之Scanner.nextLine()讀取回車的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot中如何統(tǒng)一接口返回與全局異常處理詳解
全局異常處理是個(gè)比較重要的功能,一般在項(xiàng)目里都會(huì)用到,這篇文章主要給大家介紹了關(guān)于SpringBoot中如何統(tǒng)一接口返回與全局異常處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
深入解析StringBuffer和StringBuilder的區(qū)別
以下是對(duì)java中StringBuffer與StringBuilder的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07
基于mybatis-plus-generator實(shí)現(xiàn)代碼自動(dòng)生成器
這篇文章專門為小白準(zhǔn)備了入門級(jí)mybatis-plus-generator代碼自動(dòng)生成器,可以提高開發(fā)效率。文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05
SpringBoot整合JWT框架,解決Token跨域驗(yàn)證問題
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標(biāo)準(zhǔn)((RFC 7519).定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以JSON對(duì)象的形式安全的傳遞信息。2021-06-06
java如何將list中的某個(gè)元素移動(dòng)位置
在Java編程中我們經(jīng)常會(huì)使用List數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)一組元素,下面這篇文章主要給大家介紹了關(guān)于java如何將list中的某個(gè)元素移動(dòng)位置的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05

