日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

Spring-AOP @AspectJ切点函数之@annotation()

發(fā)布時(shí)間:2025/3/21 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring-AOP @AspectJ切点函数之@annotation() 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • @annotation()概述
  • 實(shí)例

@annotation()概述

@annotation表示標(biāo)注了某個(gè)注解的所有方法。

下面通過(guò)一個(gè)實(shí)例說(shuō)明@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)@Overridepublic void greetTo(String clientName) {System.out.println("NaiveWaiter:greet to " + clientName);}@Overridepublic 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 {@Overridepublic void greetTo(String clientName) {System.out.println("NaughtWaiter:greet to " + clientName);}@NeedTest(true)@Overridepublic 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的方法中。


接下來(lái)編寫(xiě)切面的橫切邏輯

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");}}

接下來(lái)通過(guò)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.xsdhttp://www.springframework.org/schema/aophttp://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>

最后編寫(xiě)測(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 {@Testpublic 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注解的方法中。

總結(jié)

以上是生活随笔為你收集整理的Spring-AOP @AspectJ切点函数之@annotation()的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。