一文搞懂:什么是AOP?为什么要使用AOP?

1、AOP解决什么问题

在讲AOP之前,我们先来看下面的例子:

现在我们有一个控制器UserControler,有查询,新增,编辑,删除用户等操作。

public class UserController{
    public void query(){
        //查询用户操作
    }
    public void add(){
        //添加用户操作
    }
    public void edit(){
        //编辑用户操作
    }
    public void delete(){
        //删除用户操作
    }
}

假设我们现在有一个需求,就是当控制器里的方法被访问,需要进行权限校验。代码就变成了这样:

public class UserController{
    public void query(){
       	 authSevice.checkAuth();//检查权限
        //查询用户操作
    }
    public void add(){
         authSevice.checkAuth();//检查权限
        //添加用户操作
    }
    public void edit(){
       	 authSevice.checkAuth();//检查权限
        //编辑用户操作
    }
    public void delete(){
         authSevice.checkAuth();//检查权限
        //删除用户操作
    }
}

这样一来,重复的代码明显增多了。如果我们有很多控制器方法都需要行权限校验,那么 checkAuth()就需要复制到这些方法里,如果后面又需要新增一个需求,需要在控制器被访问后,记录一条日志,代码就变成了这样;

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、总结

综上所述,我们可以知道在没有对于业务核心代码的侵入性的前提下,给业务核心代码添加额外的功能。减少了重复代码,提高了开发效率,使得程序更加容易维护。

posted @ 2023-07-23 14:40  禅说编程  阅读(346)  评论(0)    收藏  举报