一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
@Aspect注解切面编程
前文
本文内容为工作中需要用到切面编程时总结的相关方法,主要内容为经验总结,其中难免有许多不足之处,还请见谅。
注解内容详解
切面编程顾名思义手动形成一个切面,在这个面上进行一些逻辑的处理,也就是java中非常常见的aop操作的一种,aspect of program。而本文主要介绍的是一种切面编程注解,主要是围绕类及方法的处理。首先我们需要有一个切面处理类,用来定义具体的切面上进行哪种操作。而具体到切面的实际处理,主要是围绕内容发生前后来进行,大致来说有四种:方法执行前、方法执行后、方法执行前后以及方法执行后对于返回值的处理。而针对这几种情形,各自有各自的注解:@Before,@After,@Around,@AfterReturning。另外需要注意的是,我们需要在使用上述几种注解时,对于切面的作用范围进行指定。一般指定范围为请求发生前等等情况,可以指定成具体的某个类,某个方法,也可以对应的通过模糊匹配指定若干的相关的类以及其中的方法。通过切面中切点,可以获取其中的请求方法、请求参数等等信息。通过这些信息,我们便可以对于请求的内容进行操作,也就实现了切面的实际意义。
注解示例代码
@Aspect
@Component
public class TestAspect {
@Around("execution(* xxController.*(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("before @around execution======");
Object[] objects = joinPoint.getArgs();
for (int i = 0; i < objects.length; i++) {
if(objects[i].getClass() == String.class){
objects[i] = "01";
}
}
Object result = joinPoint.proceed(joinPoint.getArgs());
System.out.println("after @around execution============");
return result;
}
@Before("execution(* xxController.*(..))")
public void before(JoinPoint joinPoint){
System.out.println("before @before =========");
System.out.println(joinPoint.getSignature().getName());
}
@After("execution(* xxController.*(..))")
public void after(JoinPoint joinPoint){
System.out.println("after @after ===========");
System.out.println(joinPoint.getSignature().getName());
}
@AfterReturning(value = "execution(* xxController.*(..))",returning = "returnValue")
public Object afterReturning(JoinPoint joinPoint,Object returnValue){
System.out.println("@AfterReturning");
System.out.println(joinPoint.getSignature().getName());
System.out.println(returnValue);
return returnValue;
}
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。