AOP能干什么?

AOP能干什么?

  • AOP能干什么?
  • 预备知识
    • Before Advice
    • After Advice
    • Around Advice
  • AOP能干啥呢
    • 处理参数值
    • 处理输出结果
  • 总结

AOP能干什么?

我们在之前的博客中已经提出了一个例子,可以通过AOP来实现权限的一个认证,详情可以参考这篇博客
AOP是什么

总所周知哈,AOP可以在不改变原代码的情况下完成一些我们意想不到操作,那么到底可以用来干什么呢?咱们一起来看一看
在这里插入图片描述

预备知识

首先,咱们要先了解一些小知识点,首先什么是Advice?

例如,我们设计了一个验证码校对接口,因为我们并不需要区别大小写,所以我们要把输入的字母全都调整为大写,但是我们并不想在接口内部对字母进项大写操作,因此我们在接口前建立一个切面,把所有的字母都调整为大写,把字母调整为大写的操作就是Advice

Advice的类别有以下几类,为了方便理解,我们以接口为例介绍Advice的类别。

Before Advice

可以理解为进入接口之前的操作,也就是刚刚我们提到的字母进入接口之前,先用我们的Advice把它调成大写,举个栗子
在这里插入图片描述
Aspect
Aspect就是point cut 与 Advice的组合

package com.xiaow.springsecuriydemo.aop.advice;import com.xiaow.springsecuriydemo.entity.Admin;
import com.xiaow.springsecuriydemo.entity.Person;
import com.xiaow.springsecuriydemo.service.AdminService;
import com.xiaow.springsecuriydemo.service.PersonService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.lang.reflect.Array;
import java.util.List;@Aspect
@Component
public class TestAdvice {//Pointcut@Pointcut("@annotation(com.xiaow.springsecuriydemo.aop.annotation.TestAnnotation)")public void TestPointCut() {}//Advice@Before(value = "TestPointCut()")public void before(JoinPoint joinPoint) throws IllegalAccessException, NoSuchFieldException {System.out.println("Advice");}}

Controller

@GetMapping("testAOP")@TestAnnotationpublic Result testAOP(@RequestParam(required = false) String info) {System.out.println("接口处理");return Result.succ(info);}

调用接口之后可以发现,先进行的Before Advice然后执行接口内的操作
在这里插入图片描述

After Advice

接口执行完毕之后执行的Advice,无论接口内操作正常结束还是抛出异常,都会执行的内容

把注解改一下就可以,由Before改为了After

@After(value = "TestPointCut()")public void before(JoinPoint joinPoint) throws IllegalAccessException, NoSuchFieldException {System.out.println("Advice");}

看下结果
在这里插入图片描述
确实Advice是在接口之后执行的,那么咱们看看有异常了还能执行吗

改下接口,经典的1/0

@GetMapping("testAOP")@TestAnnotationpublic Result testAOP(@RequestParam(required = false) String info) {System.out.println("接口处理");int a=1/0;return Result.succ(info);}

看下结果
在这里插入图片描述
虽然一堆异常,但很明显还是执行了

Around Advice

这个我认为是最自由的Advice了。Around,顾名思义,环绕的意思,就是说进入接口前和出接口后,都可以操作,那么我们想要修改参数值,返回值之类的就很方便了。这里举个例子。

修改下Advice

@Around(value = "TestPointCut()")public void before(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("Before");Object[] args = joinPoint.getArgs();Object proceed = joinPoint.proceed(args);System.out.println("After");}

输出结果如下
在这里插入图片描述
可以注意到,此时若是接口中出现异常,并不能返回输出After。

那怎么次啊能无视异常,直接输出After呢?

这时候,你就突然想到了,这里不进行下面操作了是因为我们把异常抛出去了,那我们直接不抛不就完事了

    @Around(value = "TestPointCut()")public void before(ProceedingJoinPoint joinPoint) throws Throwable {System.out.println("Before");try {Object[] args = joinPoint.getArgs();Object proceed = joinPoint.proceed(args);}catch (Exception e){e.printStackTrace();}System.out.println("After");}

输出结果如下,这不就可以了
在这里插入图片描述
另外,还有两类,这里博主就不仔细讲了,咱们主要是围绕着Around Advice进行处理,来看看这能有什么用吧
在这里插入图片描述

AOP能干啥呢

这里我们从输入参数和返回结果两方面去考虑哈。

例如说,我们在接收到一些参数值时,我们可能需要对其进行处理之后才能使用,并且每个接口都需要做这样的预处理,这时候每个接口都写相同的代码就太冗余了,那是不是可以用AOP进行处理呢,答案是可以的。

另外,我们在返回结果时,也需要对结果处理之后才能返回,同样所有接口都需要做这个操作,这个固定的操作同样也可以用AOP进行处理。

咱们举两个例子来看下怎么搞吧。

处理参数值

ok,还是刚才的例子哈。

假如哈,重点是假如哈。

博主来扮演一个极度自恋的人,即使听到别人说我丑,博主也会自动认为被人再夸博主帅
在这里插入图片描述

那我们怎么做呢,是不是把输入的丑字换成帅就可以了,然后帅的话就什么都不管了

那看看咋弄哈

 @GetMapping("testAOP")@TestAnnotationpublic Result testAOP(@RequestParam(required = false) String info) {return Result.succ(info);}

Controller不需要变,就改Aspect就可以,这就是AOP的魅力!

注意哈

Object proceed = joinPoint.proceed(args);

joinPoint.proceed完全可以认为是执行接口函数,也就是proceed就是接口输出的结果,args就是我们传递给接口的参数值,那么就很好改了,那咱们直接改下args就可以了,

@Around(value = "TestPointCut()")public Object before(ProceedingJoinPoint joinPoint) throws Throwable {Object proceed=null;System.out.println("Before");try {// 获取方法的参数值Object[] args = joinPoint.getArgs();String info = (String) args[0];// 修改传递的参数值args[0] = info.replaceAll("丑", "帅");// 传递修改的参数值给接口proceed = joinPoint.proceed(args);}catch (Exception e){e.printStackTrace();}System.out.println("After");return proceed;}

调用路径

http://localhost:8080/test/testAOP?info=太丑了

输出结果
在这里插入图片描述
很对!

处理输出结果

那么咱们怎么更改这个输出结果呢,和上面一样,改一下proceed就可以了,来看看咋改吧

   @Around(value = "TestPointCut()")public Object before(ProceedingJoinPoint joinPoint) throws Throwable {Object proceed=null;System.out.println("Before");try {Object[] args = joinPoint.getArgs();proceed = joinPoint.proceed(args);}catch (Exception e){e.printStackTrace();}// 获取原来的结果Result result= (Result) proceed;// 能到原来结果返回的字符串String info = (String) result.getData();// 修改该字符串,然后设置给返回结果result.setData(info.replaceAll("丑", "帅"));System.out.println("After");return result;}

来看看结果,这就很对了
在这里插入图片描述

总结

上面只是开个玩笑,其实Around Advice有很多大用处。

例如,一个接口是基于参数值查询结果,但是并没有设置权限,会导致没有权限的用户传递参数之后获取到不应该让他看到的数据,此时就可以对参数值进行处理,滤除掉不应该被传递过来的参数。

另外,我们在数据库设置1或0表示一种状态,但是前端不能显示0和1啊,这时候就可以通过修改输出结果来给出详细的状态描述,也可以理解为一种字典翻译。

好了,今天的AOP就到这了,溜了溜了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/578868.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

string的创建

string为引用类型,但是他的创建是特殊的, 他直接赋值的话,是现在内存中去寻找有没有一样的,当有的情况下则是讲地址赋值过去,当没有一样的则会重新去内存中创建一个 代码如下: static void Main(string[] a…

图片标注编辑平台搭建系列教程(4)——fabric几何定制渲染

背景 标注的几何,有时需要一些定制化的渲染样式,例如,线中间展示箭头,表示方向。本期教程教大家如何实现fabric几何定制化渲染。 带箭头的线 fabric提供了一些原生的几何,例如Point、Polyline、Polygon。同时提供了…

EditStarters使用

1、需要的插件,引入maven依赖快速 在maven页面右击 点击editstarters 点击ok 找我们需要的依赖

(一)kafka实战——kafka源码编译启动

前言 本节内容是关于kafka消息中间键的源码编译,并通过idea工具实现kafka服务器的启动,使用的kafka源码版本是3.6.1,由于kafka源码是通过gradle编译的,以及服务器是通过scala语言实现,我们要预先安装好gradle编译工具…

FreeRTOS day1

1.总结keil5下载代码和编译代码需要注意的事项 需要与板子连通 配置完成后才点击下载 2.总结STM32Cubemx的使用方法和需要注意的事项 下载支持包 打开芯片配置界面 3.总结STM32Cubemx配置GPIO的方法

蓝桥OJ 6003递归函数 (快速幂)

递归函数 通过这道题学习了快速幂思想 以下是我简单的总结,帮助我复习回顾: 如果指数为奇数,收集current底数后,指数除以2,底数翻倍,继续循环 如果指数为偶数,直接指数除以2,底数翻倍,继续循环 #include<bits/stdc.h> using namespace std; using ll long long; const …

什么是超声波清洗机?六大超声波清洗机必读干货分享指南

传统的清洁方式往往难以满足高效、高质量的需求&#xff0c;这时&#xff0c;超声波清洗机就显得格外重要。但什么是超声波清洗机&#xff1f;为什么它能在众多清洁设备中脱颖而出&#xff1f;接下来&#xff0c;我们将通过六大必读干货&#xff0c;一探究竟&#xff0c;开启清…

JavaScript练手小技巧:仿米哈游官网人物跟随鼠标位移效果

最近&#xff0c;有同学找到我&#xff0c;说&#xff1a;老师&#xff0c;我想模仿米哈游官网。 我说&#xff1a;可以&#xff0c;很不错的。 她说&#xff1a;有些效果有点难&#xff0c;能不能帮我看下。 于是&#xff0c;我就简单大概粗糙的讲解了下大致的原理&#xf…

网络安全入门 5 天速成教程_ WEB 安全渗透攻防技术

前言 随着 Web 技术发展越来越成熟&#xff0c;而非 Web 服务越来越少的暴露在互联网上&#xff0c;现在互联网安全主要指的是 Web 安全。 为了自身不“裸奔”在大数据里&#xff0c;渐渐开始学习 Web 安全&#xff0c;在学习 Web 安全的过程中&#xff0c;发现很大一部分知识…

【Git项目部署到本地仓库】

1. 下载安装Git 根据您的操作系统&#xff0c;访问Git的官方网站&#xff1a;https://git-scm.com/download/win 具体安装教程请访问其他博客&#xff0c;例如&#xff1a;http://t.csdnimg.cn/I28VO 安装完成后&#xff0c;您可以通过在winR键输入cmd打开命令行输入 git -…

高架学习笔记之UML图概要

目录 零、什么是UML图 一、类图 二、对象图 三、构件图 四、部署图 五、制品图 六、包图 七、组合结构图 八、用例图 九、序列图 十、通信图 十一、状态图 十二、活动图 十三、定时图 十四、交互概览图 零、什么是UML图 统一建模语言&#xff08;Unified Modeli…

SinoDB数据库导入导出工具onunload/onload

onunload以二进制形式将数据库或表写到磁带上或磁盘上。当写到磁盘时&#xff0c;以磁盘页为单位卸下数据&#xff0c;这种方式卸下的数据其效率高于dbexport。 1.onunload语法 onunload [-l] [-t <tape_device>] [-b <block size>] [-s <tape size>] <…