😀前言
本篇的Spring-AOP系类文章第四篇讲解了spring-aop的切入不表达式和JoinPoint的使用以及返回通知获取结果和异常通知中获取异常还有环绕通知
🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉
🥰spring-aop的切入表达式和JoinPoint的使用以及怎么返回通知获取结果和在异常通知中获取异常还有环绕通知
😍AOP-切入表达式
具体使用
注意事项和细节
- 切入表达式也可以指向类的方法, 这时切入表达式会对该类/对象生效
- 切入表达式也可以指向接口的方法, 这时切入表达式会对实现了接口的类/对象生效
- 切入表达式也可以对没有实现接口的类,进行切入
补充: 动态代理 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-返回通知获取结果
应用实例
● 如何在返回通知方法获取返回结果
看一个需求: 在返回通知方法获取返回的结果。
● 案例演示
- 修改\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-异常通知中获取异常
应用实例
● 异常通知方法中获取异常
看一个需求: 如何在异常通知方法中获取异常信息。
● 案例演示
- 在原来的代码上修改即可
- 修改\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-环绕通知
🍀应用实例
● 环绕通知可以完成其它四个通知要做的事情
看一个需求: 如何使用环绕通知完成其它四个通知的功能。
● 案例演示: 在原来的代码上修改即可
- 修改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; } }
- 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连支持一下,创造不易您们的支持是我的动力🤞