2023-07-23 14:40阅读: 120评论: 0推荐: 0

一文搞懂:什么是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 中国大陆许可协议进行许可。

posted @   禅说编程  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起