spring-aop的切入表达式和JoinPoint的使用以及怎么返回通知获取结果和在异常通知中获取异常还有环绕通知

简介: spring-aop的切入表达式和JoinPoint的使用以及怎么返回通知获取结果和在异常通知中获取异常还有环绕通知

😀前言

本篇的Spring-AOP系类文章第四篇讲解了spring-aop的切入不表达式和JoinPoint的使用以及返回通知获取结果和异常通知中获取异常还有环绕通知

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉


🥰spring-aop的切入表达式和JoinPoint的使用以及怎么返回通知获取结果和在异常通知中获取异常还有环绕通知

😍AOP-切入表达式

具体使用

注意事项和细节

  1. 切入表达式也可以指向类的方法, 这时切入表达式会对该类/对象生效
  2. 切入表达式也可以指向接口的方法, 这时切入表达式会对实现了接口的类/对象生效
  3. 切入表达式也可以对没有实现接口的类,进行切入

补充: 动态代理 jdk 的 Proxy 与 Spring 的 CGlib

https://www.cnblogs.com/threeAgePie/p/15832586.html

😉AOP-JoinPoint

应用实例

● 通过 JoinPoint 可以获取到调用方法的签名

● 应用实例需求

说明: 在调用前置通知获取到调用方法的签名, 和其它相关信息

● 应用实例-代码实现

前面我们已经举例说明过了

其它常用方法一

Signature signature = joinPoint.getSignature();
        System.out.println("切面类的ok4()-执行的目标方法-" + signature.getName());
        //演示一下JoinPoint常用的方法.
        joinPoint.getSignature().getName(); // 获取目标方法名
        joinPoint.getSignature().getDeclaringType().getSimpleName(); // 获取目标方法所属类的简单类名
        joinPoint.getSignature().getDeclaringTypeName(); // 获取目标方法所属类的类名
        joinPoint.getSignature().getModifiers(); // 获取目标方法声明类型(public、private、protected)
        Object[] args = joinPoint.getArgs(); // 获取传入目标方法的参数,返回一个数组
        joinPoint.getTarget(); // 获取被代理的对象
        joinPoint.getThis(); // 获取代理对象自己

🤗AOP-返回通知获取结果

应用实例

● 如何在返回通知方法获取返回结果

看一个需求: 在返回通知方法获取返回的结果。

● 案例演示
  1. 修改\SmartAnimalAspect.java

//注销原来的showSuccessEndLog()
    //这个就对应动态代理类的
    //System.out.println(" 日志-- 方法名: "+methodName+"-- 方法正常结束-- 结果:result="+result);
    // @AfterReturning(value = "execution(public floatcom.wyxedu.spring.aop.joinpoint.SmartDog.getSum(float ,float))")
    // public void showSuccessEndLog() {
    // System.out.println("返回通知");
    // }
    /**
     * returning = "res", Object res 名称保持一致
     * @param joinPoint
     * @param res 调用getSum() 返回的结果
     */
    @AfterReturning(value = "execution(public float
            com.wyxedu.spring.aop.joinpoint.SmartDog.getSum(float, float))",
    returning = "res")
    public void showSuccessEndLog(JoinPoint joinPoint, Object res) {
        System.out.println("返回通知" + "--结果是--" + res );
    }
完成测试

🔵AOP-异常通知中获取异常

应用实例

● 异常通知方法中获取异常

看一个需求: 如何在异常通知方法中获取异常信息。

● 案例演示
  1. 在原来的代码上修改即可

  1. 修改\SmartAnimalAspect.java
//注销showException()
    //这个就对应动态代理类的
    //System.out.println("日志--方法名: "+methodName+"--方法抛出异常--异常类型:"+e.getClass().getName());
    // @AfterThrowing(value = "execution(public floatcom.wyxedu.spring.aop.joinpoint.SmartDog.getSum(float ,float))")
    // public void showExceptionLog() {
    // System.out.println("异常通知");
    // }
    @AfterThrowing(value = "execution(public float com.wyxedu.spring.aop.joinpoint.SmartDog.getSum(float, float))", throwing = "throwable")
    public void showExceptionLog(JoinPoint joinPoint, Throwable throwable) {
        System.out.println("异常通知-- 异常信息--" + throwable);
    }
完成测试

😊AOP-环绕通知

🍀应用实例

● 环绕通知可以完成其它四个通知要做的事情

看一个需求: 如何使用环绕通知完成其它四个通知的功能。

● 案例演示: 在原来的代码上修改即可
  1. 修改SmartAnimalAspect.java
解释代码
  • @Around: 表示这是一个环绕通知[完成其它四个通知的功能]
  • value = "execution(public float com.wyxedu.spring.aop.aspectj.SmartDog.getSum(float, float))切入点表达式
  • doAround 表示要切入的方法 - 调用结构 try-catch-finally
@Aspect //表示是一个切面类[底层切面编程的支撑(动态代理+反射+动态绑定...)]
@Component //会注入SmartAnimalAspect2到容器
public class SmartAnimalAspect2 {
    //演示环绕通知的使用-了解
    //解读
    //1. @Around: 表示这是一个环绕通知[完成其它四个通知的功能]
    //2. value = "execution(public float com.spring.aop.aspectj.SmartDog.getSum(float, float)) 切入点表达式
    //3. doAround 表示要切入的方法 - 调用结构 try-catch-finally
    @Around(value = "execution(public float com.wyxedu.spring.aop.aspectj.SmartDog.getSum(float, float))")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object result = null;
        String methodName = joinPoint.getSignature().getName();
        try {
            //1.相当于前置通知完成的事情
            Object[] args = joinPoint.getArgs();
            List<Object> argList = Arrays.asList(args);//转换成list集合方便输出
            System.out.println("AOP环绕通知[-前置通知]" + methodName + "方法开始了--参数有:" + argList);
            //在环绕通知中一定要调用joinPoint.proceed()来执行目标方法
            result = joinPoint.proceed();
            //2.相当于返回通知完成的事情
            System.out.println("AOP环绕通知[-返回通知]" + methodName + "方法结束了--结果是:" + result);
        } catch (Throwable throwable) {
            //3.相当于异常通知完成的事情
            System.out.println("AOP环绕通知[-异常通知]" + methodName + "方法抛异常了--异常对象:" + throwable);
        } finally {
            //4.相当于最终通知完成的事情
            System.out.println("AOP环绕通知[-后置通知]" + methodName + "方法最终结束了...");
        }
        return result;
    }
}
  1. xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
    <context:component-scan
            base-package="com.spring.aop.aspectj"/>
    <!-- 开启基于注解的AOP功能 -->
    <aop:aspectj-autoproxy/>
</beans>
测试
@Test
    public void smartDogTestByProxy() {
        //得到spring容器
        ApplicationContext ioc =
                new ClassPathXmlApplicationContext("beans08.xml");
        //这里我们需要通过接口类型来获取到注入的SmartDog对象-就是代理对象
        SmartAnimalable smartAnimalable =
                ioc.getBean(SmartAnimalable.class);
        //SmartAnimalable smartAnimalable =
        //        (SmartAnimalable)ioc.getBean("smartDog");
        smartAnimalable.getSum(10, 2);
        //System.out.println("smartAnimalable运行类型="
        //        + smartAnimalable.getClass());
        System.out.println("=============================");
        //smartAnimalable.getSub(100, 20);
    }

😄总结

本篇讲解了spring-aop的切入表达式和JoinPoint的使用以及怎么返回通知获取结果和在异常通知中获取异常还有环绕通知

😍Spring-AOP系类文章

第一篇-> Spring-AOP的基本介绍以及通过先动态代理方式实现

第二篇-> Spring-动态代理深入了解

第三篇-> 再次分析-提出 Spring AOP-真正的AOP

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞


目录
相关文章
|
5月前
|
Java Maven Spring
【Spring】EL表达式失效的问题(添加 isELIgnored)
【Spring】EL表达式失效的问题(添加 isELIgnored)
|
5月前
|
数据安全/隐私保护
Spring-AOP切入点表达式详解
Spring-AOP切入点表达式详解
36 0
|
2月前
|
安全 Java 数据安全/隐私保护
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
【深入浅出Spring原理及实战】「EL表达式开发系列」深入解析SpringEL表达式理论详解与实际应用
81 1
|
12天前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
24 5
|
3月前
|
XML 前端开发 Java
深入理解Spring EL表达式的高级功能
深入理解Spring EL表达式的高级功能
107 1
|
3月前
|
XML 前端开发 Java
掌握Spring EL表达式的基础知识
掌握Spring EL表达式的基础知识
42 1
|
4月前
|
XML Java 数据格式
spring AOP切入点execution表达式
spring AOP切入点execution表达式
|
5月前
|
XML Java 数据格式
演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP
演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP
44 0
|
5月前
|
XML Java 数据格式
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
spring通过文件属性注入bean和基于xml的bean的自动装配以及spring-eel表达式的使用加代码合集
48 0
|
3月前
|
Java 数据库连接 应用服务中间件
Spring5源码(39)-Aop事物管理简介及编程式事物实现
Spring5源码(39)-Aop事物管理简介及编程式事物实现
26 0