您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
14-注解方式实现aop-注解通知种类和切点表达式抽取
发布时间:2025-01-18 20:53:21编辑:雪饮阅读()
-
上篇中完成了注解形式aop的前置增强,那么其它增强也是类同,这里就仅说下环绕增强和最终增强为例。
则切面类定义如:
package sp21.annotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
@Component("myAspect")
@Aspect
public class MyAspect {
//@Before(value="execution(* sp21.annotation.Target.save())")
public void before(){
System.out.println("前置增强....");
}
public void afterReturning(){
System.out.println("后置增强....");
}
@Around("execution(* sp21.annotation.Target.save())")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前增强....");
Object proceed=pjp.proceed();
System.out.println("环绕后增强....");
return proceed;
}
public void afterThrowing(){
System.out.println("异常抛出增强......");
}
@After("execution(* sp21.annotation.Target.save())")
public void after(){
System.out.println("最终增强....");
}
}
这里环绕增强和最终增强只不过是注解里面省略了value前缀而已。本来也是可写可不写的,当有多个属性,即不仅仅是value属性的时候才需要显式声明value的。
把before注释也同之前xml配置aop增强一样,因为环绕增强会有相当于前后置增强,如果还有前置增强,难免影响最后测试结果的观看分析。
同样的在注解方面也是支持切点表达式的抽取,例如上面的环绕增强和最终增强,都可以结合切点定义注解从而进一步优化代码的冗余。则修改后的切面类如:
package sp21.annotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Component("myAspect")
@Aspect
public class MyAspect {
//定义切点表达式
@Pointcut("execution(* sp21.annotation.Target.save())")
public void pointcut(){}
//@Before(value="execution(* sp21.annotation.Target.save())")
public void before(){
System.out.println("前置增强....");
}
public void afterReturning(){
System.out.println("后置增强....");
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("环绕前增强....");
Object proceed=pjp.proceed();
System.out.println("环绕后增强....");
return proceed;
}
public void afterThrowing(){
System.out.println("异常抛出增强......");
}
@After("MyAspect.pointcut()")
public void after(){
System.out.println("最终增强....");
}
}
关键字词:aop,注解,抽取,表达式,切点