springboot中面向切面编程(AOP)

文章目录

    • 1.什么是AOP
    • 2.springboot使用aop

1.什么是AOP

AOP就是通过动态为项目中某些类在运行过程中动态创建代理对象,在对象中完成附加功能,保证在处理业务时更加专注于自己的业务逻辑开发。
有以下几个概念:
1.通知(Advice)——给目标方法添加额外操作称之为通知,也可以称为增强
2.连接点(Joinpoint)——就是可以增强的地方(方法的前后某个阶段)
3.切入点(Pointcut)——实际增强的地方
4.切面(Aspect)——封装了通知和切入点用来横向插入的类
5.代理(Proxy)——将通知应用到目标类动态创建的对象
6.织入(Weaving)——将切面插入到目标从而生成代理对象的过程

2.springboot使用aop

springboot中面向切面编程(AOP)_第1张图片
springboot中面向切面编程(AOP)_第2张图片
springboot中面向切面编程(AOP)_第3张图片
springboot中面向切面编程(AOP)_第4张图片

springboot中面向切面编程(AOP)_第5张图片
springboot中面向切面编程(AOP)_第6张图片
springboot中面向切面编程(AOP)_第7张图片
springboot中面向切面编程(AOP)_第8张图片
springboot中面向切面编程(AOP)_第9张图片
springboot中面向切面编程(AOP)_第10张图片
springboot中面向切面编程(AOP)_第11张图片
springboot中面向切面编程(AOP)_第12张图片
springboot中面向切面编程(AOP)_第13张图片
切面类代码:

@Component
@Aspect //切面类注解
@Order(2)
public class AsceptTest {

    @Pointcut("execution(* com.study.service.UserService.eat(*))")
    private void Myeat(){};


    //前置通知。value匹配规则,也就是指定拦截的切入点(方法)
//    @Before(value = "execution(* com.study.service.UserService.eat(*))") // execution匹配某些方法效率,whithin匹配某些类(中的所有方法)
    @Before(value = "Myeat()")
    public void before(JoinPoint joinPoint){
        System.out.println("当前方法名: "+joinPoint.getSignature().getName());
        System.out.println("当前执行方法参数: "+joinPoint.getArgs()[0]);
        System.out.println("目标对象target: "+joinPoint.getTarget());
        System.out.println("前置增强——保姆做饭");
    }

    //后置通知
//    @After(value = "execution(* com.study.service.UserService.eat(*))")
    @After("Myeat()")
    public void after(JoinPoint joinPoint){
        System.out.println("当前方法名: "+joinPoint.getSignature().getName());
        System.out.println("当前执行方法参数: "+joinPoint.getArgs()[0]);
        System.out.println("目标对象target: "+joinPoint.getTarget());
        System.out.println("后置增强——保姆洗碗");
    }


    //环绕通知
    @Around(value = "execution(* com.study.service.UserService.out())" )
    public Object round(ProceedingJoinPoint joinPoint) throws Throwable { //环绕增强必须要获取ProceedingJoinPoint参数,
        System.out.println("当前方法名: "+joinPoint.getSignature().getName());
//        System.out.println("当前执行方法参数: "+joinPoint.getArgs()[0]); 目标对象没参数不可获取
        System.out.println("目标对象target: "+joinPoint.getTarget());
        System.out.println("环绕增强——保安开门"); //目标方法执行前
        Object proceed = joinPoint.proceed(); //执行目标方法
        System.out.println("环绕增强——保安关门"); //目标方法执行后
        return proceed; //返回目标方法执行结果
    }

    //异常通知
    @AfterThrowing(value = "within(com.study.service.UserService+)",throwing="e")
    public void ex(JoinPoint joinPoint,Exception e){
        System.out.println("出错了"+e.getMessage());
    }

    //返回通知,方法正常返回则生效
    @AfterReturning(value = "within(com.study.service.UserService+)",returning="result")
    public void ex(JoinPoint joinPoint,Object result){
        System.out.println(joinPoint.getSignature().getName()+ ":返回通知生效");
        System.out.println("返回了"+result);
    }


}

你可能感兴趣的:(spring,boot,aop,spring,boot)