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、总结
综上所述,我们可以知道在没有对于业务核心代码的侵入性的前提下,给业务核心代码添加额外的功能。减少了重复代码,提高了开发效率,使得程序更加容易维护。
标签:权限,一文,void,添加,AOP,搞懂,checkAuth,public From: https://www.cnblogs.com/pjfblog/p/17574994.html