AOP 01 AOP功能测试

AOP:动态代理

指在程序运行期间动态的将某段代码切入到指定位置进行运行的编程方式

步骤

  1. 导入AOP模块
  2. 定义业务逻辑类:在业务逻辑运行的时候打印日志(方法前后 异常 …)
  3. 定义日志切面类:切面里的方法需动态感知目标方法运行到哪里然后执行
  4. 给切面类的目标方法标注何时何地运行(通知注解)
  5. 将切面类和业务逻辑类(目标方法所在类)都加到容器中
  6. 必须告诉Spring哪个是切面类(给切面类加上@Aspect注解)
  7. 给配置类中的@EnableAspectJAutoProxy开启基于注解的AOP模式

    Spring中很多的@EnableXXX表示用来开启某一功能

通知注解

作用 注解 备注
前置通知 @Before
后置通知 @After 无论正常结束还是异常结束都会调用
返回通知 @AfterReturning 正常返回后运行
异常通知 @AfterThrowing
环绕通知 @Around 动态代理 手动推进目标方法运行joinPoint.proceed() 相当于一个最底层的通知

代码测试

业务逻辑类
MathCaculator.java

/*** @Classname MathCaculator* @Description AOP测试_业务逻辑类*/public class MathCaculator {public int div(int i,int j){System.out.println("MathCaculator 运行 div() ...");return i/j;}
}

切面类


/*** @Classname LogAspects* @Description 切面类* @Date 2021/8/5 10:34* @Created by LXLDEMO*/
@Aspect
public class LogAspects {/*** 抽取公共的切入点表达式* 指向目标方法* 1. 本类引用* 2. 其他的切面引用*/@Pointcut("execution(public int com.example.annotations.bean.MathCaculator.div(int ,int ))")public void pointCut(){}@Before("pointCut()")public void logStart(JoinPoint joinPoint){Object[] args = joinPoint.getArgs();System.out.println("运行@Before");System.out.println("方法名字 " + joinPoint.getSignature().getName());System.out.println("方法参数 " + Arrays.toString(args));}/*** 注解中参数的这种写法属于其他切面的调用方式* 全包名* @param joinPoint*/@After("com.example.annotations.aop.LogAspects.pointCut()")public void LogEnd(JoinPoint joinPoint){System.out.println("运行@After " + joinPoint.getSignature().getName());System.out.println(joinPoint.getSignature().getName() + "运行结束");}/*** 当有多个参数的时候 JoinPoint必须作为第一个参数* @param joinPoint* @param result*/@AfterReturning(value = "pointCut()",returning = "result")public void logReturning(JoinPoint joinPoint,Object result){System.out.println("运行@AfterReturning");System.out.println(joinPoint.getSignature().getName()+"正常返回" + result);}/*** 当有多个参数的时候 JoinPoint必须作为第一个参数* @param joinPoint* @param exception*/@AfterThrowing(value = "pointCut()",throwing = "exception")public void logException(JoinPoint joinPoint,Exception exception){System.out.println("运行@AfterThrowing");System.out.println("" + joinPoint.getSignature().getName() +" === 异常信息:"+exception);}
}

配置类

/*** @Classname MainConfig4AOP* @Description 配置类* @Date 2021/8/5 10:31* @Created by LXLDEMO*/
@EnableAspectJAutoProxy
@Configuration
public class MainConfig4AOP {@Beanpublic MathCaculator caculator(){System.out.println("准备注入 MathCaculator ...");return new MathCaculator();}@Beanpublic LogAspects logAspects(){System.out.println("准备注入 LogAspects ...");return new LogAspects();}
}

测试

    @Testvoid Aoptest(){//配置类测试System.out.println("准备创建容器");// 注意要使用无参构造器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig4AOP.class);System.out.println("容器创建完毕");// 获取beanMathCaculator mathCaculator = applicationContext.getBean(MathCaculator.class);mathCaculator.div(1,1);// 关闭容器applicationContext.close();System.out.println("容器已关闭");}

测试结果

将参数换成(1,0)

【SpringBoot_ANNOTATIONS】AOP 01 AOP功能测试相关推荐

  1. Spring AOP(一) AOP基本概念

    Spring AOP 基本概念 术语 容易理解 举个栗子给大家讲一下代理: 什么是AOP? 基本术语 (1)切面(Aspect) (2) 目标对象(Target) (3) 连接点(JoinPoint) ...

  2. Spring AOP / AspectJ AOP 的区别?

    Spring AOP / AspectJ AOP 的区别? Spring AOP属于运行时增强,而AspectJ是编译时增强. Spring AOP基于代理(Proxying),而AspectJ基于字 ...

  3. 【Spring AOP】AOP 底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂如何加工原始对象

    AOP编程 AOP 编程 AOP 概念 AOP 编程的开发步骤 切面的名词解释 AOP 的底层实现原理 动态代理类的创建 JDK 的动态代理(原理 + 编码) CGlib 的动态代理 Spring 工 ...

  4. Aop简介 Aop术语 SpringAOP

    1.AOP简介 1.AOP (面向切面编程):是一种新的方法论,是对传统OOP(面向对象编程)的补充 2.AOP 的主要编程对象是切面(aspect),而切面模块化横切关注点 3.在应用AOP编程时, ...

  5. spring Aop中aop:advisor 与 aop:aspect的区别

    在spring的配置中,会用到这两个标签.那么他们的区别是什么呢? <bean id="testAdvice" class="com.myspring.app.ao ...

  6. 关于aop,AOP的应用场景?什么事AOP?

    什么是AOP? **AOP(Aspect-OrientedProgramming,面向方面编程)**可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.它 ...

  7. Aop介绍 ,aop使用 aop解释

    Aop介绍 AOP是面向切面编程,OOP是面向对象编程. 所谓的面向切面编程.就是添加到其他程序的方法之前执行. 把方法切开在方法之前添加一些辅助功能使方法代码更加纯粹增加代码复用. 官方解释:AOP ...

  8. spring AOP中 aop:advisor 与 aop:aspect 的区别

    在开发过程中,不少有Spring Aop的使用, 在面向切面编程时,我们会使用< aop:aspect>: 在进行事务管理时,我们会使用< aop:advisor>. 那么,对 ...

  9. Spring AOP【AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别】

    Spring AOP[AOP的基本实现与动态代理JDK Proxy 和 CGLIB区别]

  10. spring AoP学习 -----AoP的基本概念

    Aop的发展经理过两个阶段,第一个是静态Aop阶段,第二个是动态Aop阶段. 静态Aop阶段:作为第一代的Aop,以最初的AspectJ为代表,特点是以相应的横切关注点以Aspect形式实现之后,会通 ...

最新文章

  1. 汇总|3D目标检测文章(CVPR2020)
  2. AlphaGo的原理
  3. 笔记本电脑处理器_英特尔发布第九代酷睿移动处理器:笔记本电脑进入8核5.0GHz时代!...
  4. 基础连接已经关闭: 无法连接到远程服务器
  5. maven的常用命令
  6. bind merge r 和join_[R] 制作梅西和C罗进球数的quot;追赶动画quot; - ggplot2 + gifski
  7. 回首阿里10年产品经理路,1点忠告希望在2021帮到你
  8. TMM|车辆重识别的一些实践
  9. Kali Linux Web 渗透测试秘籍 第六章 利用 -- 低悬的果实
  10. [fastjson] - fastjson中 JSONObject 和 JSONArray
  11. 【C++】运算符重载关于const的分析(超详细)
  12. php memcache技术,Memcache操作类如何在PHP中使用
  13. virtualbox安装win7_全网最详细的安装eNSP和HCL步骤和出现的问题及解决方法
  14. python opencv 打开相机检测圆点
  15. js中数组的一些常见操作 - 1
  16. dota2国服服务器位置,Dota2国服完整安装教程
  17. html编辑器怎么设置为excel,excel2013宏编辑器的设置方法教程
  18. 9.群智能算法及其应用: 粒子群优化算法及应用, 蚁群算法及其应用
  19. 10年测试,告诉你常见的软件测试类型有哪些?
  20. 智能硬件Linux效能更高,Android软硬件巧妙整合的开发技 - 嵌入式操作系统 - 电子发烧友网...

热门文章

  1. 独家 | 全球 AI 量化金融机构全景图(附完整分析)
  2. (转)智能投顾面临的法律合规问题及国际监管经验
  3. Julia: 关于下载库时WinRPM的Bug
  4. Juno: 字体缩放
  5. 一文读懂「云上企业级存储」
  6. 直播预告|阿里云容器网络文件系统发布会
  7. 趋势 | 2020年云计算的10大市场方向
  8. 查看linux jvm使用情况,查看jvm内存使用命令
  9. 【风电功率预测】基于matlab麻雀算法优化BP神经网络风电功率预测【含Matlab源码 1319期】
  10. 查看-增强会话_会话助手平台-Hinglish Voice等!