ASpectJ对AOP的实现

时间:2022-04-24
本文章向大家介绍ASpectJ对AOP的实现,主要内容包括切入点表达式、基于注解、基于XML、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

切入点表达式

基于注解

 1 @Aspect // 表示当前类切面
 2 public class MyAspect {
 3 
 4     @Before("execution(* *..ISomeService.doFirst(..))")
 5     public void before(JoinPoint jp) {
 6         System.out.println("执行 before2" + jp);
 7     }
 8 
 9     @AfterReturning(value = "execution(* *..ISomeService.doSecond(..))", returning = "result")
10     public void myAfterReturning(Object result) {
11         System.out.println("执行 my after, result" + result);
12     }
13 
14     // 定义了一个切入点
15     @Pointcut("execution(* *..ISomeService.doThird(..))")
16     public void doThirdPointCut(){}
17 
18     @Around("doThirdPointCut()")
19     public Object myAround(ProceedingJoinPoint pp) throws Throwable {
20         System.out.println("执行around1");
21         Object res = pp.proceed();
22         System.out.println("执行around2 " + res);
23         return res;
24     }
25 
26 }
1         <bean id="myAspect" class="day1208.MyAspectXML"/>
2         <bean id="someService" class="day1208.ServiceImpl"/>
3         <aop:aspectj-autoproxy/>

如果运行的时候出现error at ::0 can't find referenced pointcut, 一般是因为jdk版本和AspectJ.Weaver不一致.

1.6以下的aspectj需要用jdk1.6运行. 

基于XML

 1 public class MyAspectXML {
 2 
 3     public void before(JoinPoint jp) {
 4         System.out.println("执行 before2" + jp);
 5     }
 6 
 7     public void myAfterReturning(Object result) {
 8         System.out.println("执行 my after, result" + result);
 9     }
10     public void myAfterReturning() {
11         System.out.println("执行 my after, no result");
12     }
13 
14     public void doThirdPointCut(){}
15 
16     public Object myAround(ProceedingJoinPoint pp) throws Throwable {
17         System.out.println("执行around1");
18         Object res = pp.proceed();
19         System.out.println("执行around2 " + res);
20         return res;
21     }
22 
23 }
1         <aop:config>
2                 <aop:pointcut id="secondPT" expression="execution(* *..ISomeService.doSecond(..))"/>
3                 <aop:aspect ref="myAspect">
4                         <aop:before method="before" pointcut="execution(* *..ISomeService.doFirst(..))"/>
5                         <aop:after-returning method="myAfterReturning(java.lang.Object)" pointcut-ref="secondPT" returning="result"/>
6                 </aop:aspect>
7         </aop:config>