Spring第七篇【AOP】

aop术语

JoinPoint(连接点): 可以增强的方法

PointCut(切入点): 需要被增强的方法

Advice(通知/增强): 封装增强业务逻辑代码的方法P

Aspect(切面): 切点+通知

Weaving(织入): 通知与切入点结合的过程

切点表达式

表达式写法

execution([修饰符] 返回值类型 包名.类名 方法名(参数列表))

  • 修饰符可以省略
  • 返回值类型、包名、类名、方法名可以用代替,表示任意
  • 包名和类名之间的一个点.表示当前包下的类,两个点..表示当前包及其子包下的类
  • 参数列表可以用两个点..表示任意个参数,任意类型

通知类型

Spring第七篇【AOP】_第1张图片

aop以xml的方式

package com.example.demo;

import org.aspectj.lang.ProceedingJoinPoint;

public class MyAspect {
    public void before() {
        System.out.println("before-----------");
    }

    public void afterReturning(){
        System.out.println("afterReturning-----------");
    }

    public void afterThrowing(){
        System.out.println("afterThrowing-----------");
    }

    public void after() {
        System.out.println("after-----------");
    }

    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("aroundBefore-----------");
        Object proceed = proceedingJoinPoint.proceed();
        System.out.println("aroundAfter-----------");
        return proceed;
    }
}




    

    

    
        
    

    
        
            
            
            
            
            
        
    


## aop以注解的方式

package com.example.demo.anno;

        import org.aspectj.lang.ProceedingJoinPoint;
        import org.aspectj.lang.annotation.*;
        import org.springframework.stereotype.Component;

@Component
@Aspect
public class MyAspect {

    //切点表达式
    @Pointcut("execution(void com.example.demo.anno.*.save(..))")
    public void myPoint(){}

    @Before("myPoint()")
    public void before() {
        System.out.println("before-----------");
    }

    @After("myPoint()")
    public void after() {
        System.out.println("after-----------");
    }

    @Around("myPoint()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("aroundBefore-----------");
        Object proceed = proceedingJoinPoint.proceed();
        System.out.println("aroundAfter-----------");
        return proceed;
    }

    @AfterThrowing("myPoint()")
    public void afterThrowing(){
        System.out.println("afterThrowing-----------");
    }
    @AfterReturning("MyAspect.myPoint()")
    public void afterReturning(){
        System.out.println("afterReturning-----------");
    }
}



    
    

    
    

备注:

除环绕通知外,其它通知执行顺序不一定

你可能感兴趣的:(Spring第七篇【AOP】)