一文搞懂:什么是AOP?为什么要使用AOP?
1、AOP解决什么问题
在讲AOP之前,我们先来看下面的例子:
现在我们有一个控制器UserControler,有查询,新增,编辑,删除用户等操作。
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
public class UserController{ public void query(){ //查询用户操作 } public void add(){ //添加用户操作 } public void edit(){ //编辑用户操作 } public void delete(){ //删除用户操作 } }
假设我们现在有一个需求,就是当控制器里的方法被访问,需要进行权限校验。代码就变成了这样:
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
public class UserController{ public void query(){ authSevice.checkAuth();//检查权限 //查询用户操作 } public void add(){ authSevice.checkAuth();//检查权限 //添加用户操作 } public void edit(){ authSevice.checkAuth();//检查权限 //编辑用户操作 } public void delete(){ authSevice.checkAuth();//检查权限 //删除用户操作 } }
这样一来,重复的代码明显增多了。如果我们有很多控制器方法都需要行权限校验,那么 checkAuth()就需要复制到这些方法里,如果后面又需要新增一个需求,需要在控制器被访问后,记录一条日志,代码就变成了这样;
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
public class UserController{ public void query(){ authSevice.checkAuth();//检查权限 //查询用户操作 LogService.addVLog();//添加访问日志 } public void add(){ authSevice.checkAuth();//检查权限 //添加用户操作 logService.addLog();//添加访问日志 } public void edit(){ authSevice.checkAuth();//检查权限 //编辑用户操作 logService.addLog();//添加访问日志 } public void delete(){ authSevice.checkAuth();//检查权限 //删除用户操作 logService.addLog();//添加访问日志 } }
新增的需求,导致我们需要在每个方法后面添加addLog()方法,如果我们方法很多,那我们的改造量也是很大的。
那有没有其他办法解决在不改动UserController的前提下,给UserController的每个方法,新增 checkAuth()和addLog()功能呢?
这就用到AOP了,AOP主要解决的问题就是:在没有对于业务核心代码的侵入性的前提下,给业务核心代码添加额外的功能。
2、什么是AOP
AOP 是Aspect Obtain Programming 的缩写,中文翻译是 面向切面编程。
那么面向切面的切面到底指的是什么呢?
在传统的开发中,我们要一个功能模块被请求一般需要经过:客户端程序->controller层 -> service层(业务代码) -> dao层(数据库操作),如下图:
那么一个系统显然不止只有一个模块,当模块多了就变成这样:
接下来我们需要给每一模块增加权限验证和添加日志,那这个时候AOP怎么做呢?
就是把切面切开,把权限验证和添加日志的代码添加进去,比如这样:
这个例子只是一个简化的模型,实际中的AOP切面比这要复杂得多,但从中也能直观了解,面向切面的切面是怎么回事了。
3、总结
综上所述,我们可以知道在没有对于业务核心代码的侵入性的前提下,给业务核心代码添加额外的功能。减少了重复代码,提高了开发效率,使得程序更加容易维护。
本文作者:禅说编程
本文链接:https://www.cnblogs.com/pjfblog/p/17574994.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!