4月更文d11n11-@Aspect注解切面编程

133 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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;
    }
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。