當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring-AOP @AspectJ切点函数之@annotation()
生活随笔
收集整理的這篇文章主要介紹了
Spring-AOP @AspectJ切点函数之@annotation()
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- @annotation()概述
- 實例
@annotation()概述
@annotation表示標注了某個注解的所有方法。
下面通過一個實例說明@annotation()的用法。 AnnotationTestAspect定義了一個后置切面增強,該增強將應用到標注了NeedTest的目標方法中。
實例
代碼已托管到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) // 聲明可以使用該注解的目標類型 @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); }接口實現類 兩個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()方法標注了@NeedTest, NaughtWaiter#serverTo()也標注了@NeedTest,我們的目標就是將后置增強織入到這兩個標注了@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表示標注了某個注解的所有方法* * @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自動應用切面,配置文件如下
<?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命名空間進行配置 --><!-- 基于@AspectJ切面的驅動器 --> <aop:aspectj-autoproxy/><!-- 目標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 {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("com/xgj/aop/spring/advisor/aspectJ/function/annotationFun/conf-annotation.xml");// 必須是接口類型,否則拋類型轉換異常Waiter waiter = (Waiter) ctx.getBean("naiveWaiter");// 因為greetTo標注了@NeedTest,因此會被后置增強waiter.greetTo("XiaoGongJiang");waiter.serverTo("XiaoGongJiang");Waiter naughtWaiter = (Waiter) ctx.getBean("naughtWaiter");// serverTo標注了@NeedTest,因此會被后置增強naughtWaiter.serverTo("XiaoGongJiang");} }運行結果:
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從輸出結果中可以看出,切面被正確的織入到了標注有@NeedTest注解的方法中。
總結
以上是生活随笔為你收集整理的Spring-AOP @AspectJ切点函数之@annotation()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-AOP @AspectJ切
- 下一篇: Spring-AOP @AspectJ切