首页 > 其他分享 >一文搞懂:什么是AOP?为什么要使用AOP?

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

时间:2023-07-23 14:56:51浏览次数:27  
标签:权限 一文 void 添加 AOP 搞懂 checkAuth public

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

相关文章

  • AOP详解
    使用AOPAOP(AspectOrientedProgramming),即面向切面编程。AOP是一种新的编程方式,它和OOP不同,OOP把系统看作多个对象的交互,AOP把系统分解为不同的关注点,或者称之为切面(Aspect)。要理解AOP的概念,我们先用OOP举例,先回顾一下OOP(ObjectOrientedProgramming),OOP作为面向对象编程的模......
  • 如何动态修改 spring aop 切面信息?让自动日志输出框架更好用
    业务背景很久以前开源了一款auto-log自动日志打印框架。其中对于spring项目,默认实现了基于aop切面的日志输出。但是发现一个问题,如果切面定义为全切范围过大,于是v0.2版本就是基于注解@AutoLog实现的。只有指定注解的类或者方法才会生效,但是这样使用起来很不方便。......
  • Java多线程详解——一篇文章搞懂Java多线程
    Java多线程详解——一篇文章搞懂Java多线程目录1.基本概念2.线程的创建和启动2.1.多线程实现的原理2.2.多线程的创建,方式一:继承于Thread类2.3.多线程的创建,方式一:创建Thread匿名子类(也属于方法一)2.4.多线程的创建,方式二:实现Runnable接口2.4.1.比较创建线程的两种......
  • AOP
    AOP依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>第一种方式:packagecom.atguigu.activity.aop;​impor......
  • 一文解读私域流量
    早在2019年,流量市场出现了一个新词–“私域流量”。它的出现,是一种偶然,也是一种必然。偶然,是因为它源自于流量饥渴;必然,是因为它是一种“捷径”。我记得最早听到“私域流量”这个词,是年初的时候,来自GrowingIo创始人张溪梦,一次关于增长黑客实践的分享。而私域流量,最早出现在17年的......
  • java aop记录用户操作日志如何获取请求参数
    在Java中,AOP(面向切面编程)是一种编程范式,它可以将横切关注点(如日志记录)从业务逻辑中分离出来,使得代码更加清晰、可维护和可扩展。在记录用户操作日志时,我们可以使用AOP来拦截请求并获取请求参数。首先,我们需要创建一个切面类来实现日志记录的逻辑。假设我们使用Spring框架和AspectJ......
  • 一文掌握如何前后端分离?
    随着科技的进步和发展,低代码开发产品拥有广阔的市场前景。前后端分离似乎早已经是发展趋势了,因为做好前后端分离对于前后端的工程师而言是非常有利的,这样也有利于提升办公协作效率。那么,如何前后端分离?分别都有哪些内容?别着急,这篇文章将会围绕客户关心的问题,给大家一一做出解答。......
  • 【JDK新特性】一篇搞懂Lambda表达式 & 函数式接口
    概述Lambda是JDK8的语法糖。它可以对某些匿名内部类的写法进行简化,它是函数式编程的一个重要体现。让我们不用关注什么是对象,重点关注我们对数据做了什么操作,可以说它Lambda表达式就是一个对象Lambda表达式在C++、C#、Python、Scala等一些语言中也支持,Java支持的还算比较晚的(确实好......
  • 一文带你读懂Arthas实现原理
    一.前言Arthas相信大家已经不陌生了,肯定用过太多次了,平时说到Arthas的时候都知道是基于JavaAgent的,那么他具体是怎么实现呢,今天就一起来看看。首先Arthas是在GitHub开源的,我们可以直接去GitHub上获取源码:Arthas。本文基于Arthas3.6.7版本源码进行分析,具体源码注......
  • 一文带你了解KET/PET英语学习
    https://zhuanlan.zhihu.com/p/80996894一文带你了解KET/PET英语学习这几年来,剑桥英语考试KET/PET越来越受关注。但这传说中的KET/PET到底是什么,考什么内容?可能很多父母还不清楚,今天小编就带你深入了解一下KET和PET。什么是剑桥MSE?想要了解KET和PET,我们首先来了解一下剑桥通用......