「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
前言
感谢阅读菜菜的文章,本篇文章是继上一篇 SpringBoot AOP学习(一):AOP的诞生及AOP注解介绍后对AOP注解的使用作一个具体的应用,由于本身我也是才接触不久,借此机会把自己的学习心得记录下来,也希望各位大佬不吝赐教~
为了学起来更加得心应手,这里简单复习了下IOC:
IOC理论,用来实现对象之间的“解耦”,解决对象之间的耦合度过高的问题。IOC(控制反转)的具体实现是通过借助于“第三方”实现具有依赖关系的对象之间的解耦,这个“第三方”就是IOC容器;同时,IOC也叫依赖注入(DI),那么这两种叫法的区别是什么,且看:
控制反转:获得依赖对象的过程被反转了,从前主动,现在被动
依赖注入:就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中
他们两兄弟是同一个东西从不同的角度来进行描述的,IOC中最基本的技术就是“反射(Reflection)”编程
AOP日志功能实战
菜菜接触一个项目要实现日志功能,需求如下:
1、记录操作人、操作时间
2、记录request请求参数
3、记录response回调数据
4、记录具体的业务描述供系统使用者查看(这里需要自定义注解)
案例代码结构
为了方便,菜菜将所有代码放在了同一包内
重点就是这个Aspect切面类
开始实现
首先,
先定义实体类和controller类
ReqDTO.java
1 | bash复制代码package com.caicai.aop.csdn; |
TestController.java
1 | bash复制代码package com.caicai.aop.csdn; |
然后是定义自定义注解
MyLog .java
1 | bash复制代码package com.caicai.aop.csdn; |
最后,定义我们的切面
要想把一个类变成切面类,需要两步,
第一步,在类上使用 @Component 注解 把切面类加入到IOC容器中
第二步,在类上使用 @Aspect 注解 使之成为切面类
TestAspect .java
1 | bash复制代码package com.caicai.aop.csdn; |
测试
正常测试
结果:
1 | bash复制代码--------Around方法开始执行 |
异常测试
在TestController.java下test方法里面加上 int i = 1 / 0; //模拟异常
1 | bash复制代码 @RequestMapping(path = "/test", method = RequestMethod.POST) |
再次发送请求
结果:
1 | bash复制代码--------Around方法开始执行 |
总结
AOP真真真强啊!面向切面编程(aop)是对面向对象编程(oop)的补充,面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
实现AOP的技术,主要分为两大类:
- 采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
- 采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理。
AOP框架具有的两个特征:
- 各个步骤之间的良好隔离性
- 源代码无关性
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象。
最后,对于实际应用中 @Around的应用非常广泛,下一篇来具体学习一下它~
本文转载自: 掘金