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

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


图片转PDF
cf称号系统玩法 称号获得条件及属性大全