Loading

六、SpringBoot整合aop(SpringBoot系列)

SpringBoot整合aop

@Component
@Aspect //切面声明
public class LogComponent {
    // 标注拦截的方法
    // 后面*的表示org.javaboy.aop.service目录下所有方法,方法入参为 数量任意,类型任意
    @Pointcut("execution(* org.javaboy.aop.service.*.*(..))")
    public void pc1() {
    }

    @Before(value = "pc1()") //前置通知
    public void before(JoinPoint jp) {
        // 方法名
        String name = jp.getSignature().getName();
        System.out.println("before--" + name);
    }

    @After(value = "pc1()") // 后置通知
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println("after--" + name);
    }

    // 返回通知 returning指返回值
    @AfterReturning(value = "pc1()", returning = "result") //返回通知
    public void afterReturning(JoinPoint jp, Object result) {
        String name = jp.getSignature().getName();
        System.out.println("afterReturning----" + name + "-----" + result);
    }

   
    @AfterThrowing(value = "pc1()",throwing = "e")  // 异常通知
    public void afterThrowing(JoinPoint jp,Exception e) {
        String name = jp.getSignature().getName();
        System.out.println("afterThrowing---"+name+"----"+e.getMessage());
    }

    // 环绕通知,相当于上面的四个的综合
    @Around("pc1()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        // pjp就是被拦截的方法,调用proceed()方法,被拦截的方法才会被执行
        // 想用前置通知,就在调用proceed()方法前
        // 想用前置通知,就在调用proceed()方法后
        // 想用异常通知,就在try-catch 调用proceed()方法
        Object proceed = pjp.proceed();
        return "www.javaboy.org";
    }
}

转载:https://www.cnblogs.com/itsoku123/p/10744244.html

文中有九种表达式的详细介绍

@Pointcut中有中9种切入点表达式的写法

  1. execute
  2. within
  3. this
  4. target
  5. args
  6. @target
  7. @within
  8. @annotation
  9. @args

1. execute

拦截任意公共方法

execution(public * *(..))

拦截以set开头的任意方法

execution(* set*(..))

拦截类或者接口中的方法

execution(* com.java.service.AccountService.*(..))

拦截包中定义的方法,不包含子包中的方法

execution(* com.java.service.*.*(..))

拦截com.java.service包中所有类中任意方法,不包含子包中的类

拦截包或者子包中定义的方法

execution(* com.java.service..*.*(..))

拦截com.java.service包或者子包中定义的所有方法

2.within表达式

表达式格式:包名.* 或者 包名..*

拦截包中任意方法,不包含子包中的方法

within(com.java.service.*)

拦截service包中任意类的任意方法

拦截包或者子包中定义的方法

within(com.java.service..*)

拦截service包及子包中任意类的任意方法

3.@annotation表达式

匹配有指定注解的方法(注解作用在方法上面)

@annotation(com.java.demo2.Annotation)

被调用的方法包含指定的注解的会被拦截

应用场景

常见用于记录日志、异常集中处理、权限验证、Web 参数校验、事务处理等等

//TODO code小demo

posted @ 2021-05-23 22:48  半瓶牛奶🥛  阅读(158)  评论(0编辑  收藏  举报