【Spring】Spring中AOP的简介和基本使用,SpringBoot使用AOP

  📝个人主页:哈__

期待您的关注 

一、AOP简介

 AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程)。它是面向对象编程(OOP)的一种补充,目前已成为一种比较成熟的编程方式。

在传统的业务处理代码中,通常都会进行事务处理、日志记录等操作。虽然使用OOP可以通过组合或者继承的方式来达到代码的重用,但如果要实现某个功能(如日志记录),同样的代码仍然会分散到各个方法中。这样,如果想要关闭某个功能,或者对其进行修改,就必须要修改所有的相关方法。这不但增加了开发人员的工作量,而且提高了代码的出错率。

为了解决这一问题,AOP思想随之产生。AOP采取横向抽取机制,将分散在各个方法中的重复代码提取出来,然后在程序编译或运行时,再将这些提取出来的代码应用到需要执行的地方。这种采用横向抽取机制的方式,采用传统的OOP思想显然是无法办到的,因为OOP只能实现父子关系的纵向的重用。虽然AOP是一种新的编程思想,但却不是OOP的替代品,它只是OOP的延伸和补充。

 可以看看类和切面的关系,图片来自黑马程序员。

 行了,到了这一步了也不就在废话了,我在尽量不使用太多专业术语的情况下尽可能给大家讲明白AOP。

二、AOP个人浅谈

在我们传统的OOP(面向对象编程)时,在我们原有的方法上我们希望做一些修改,我们希望啊,在执行这个方法之前通知我们的老板,告诉他我已经开始执行任务啦,不要再催促我了。在方法执行结束后,我还要把执行结果告诉老板。那么你会怎么做,是如下边的代码一样吗?

这样子做的确没问题,但是你有没有想过,如果我们的老板比较认真,每一项任务都要向老板汇报,那么你这样写代码还方便吗?如果你只有几项任务的话还好说,就是累一些,但如果你有五十项,一百项呢?

这时AOP就凸显出它的优点了。如果看了简介不明白什么是AOP,那么现在来看看我的理解。

你有很多的任务,你无法把每一项任务都向老板汇报。这时有着这样的一个组织,这个组织可以帮你和老板进行沟通,如果你想对你任务进行这样的能力增强,你就要告诉这个组织,你需要他们的帮助。什么意思呢?我用一张图来解释。

 你需要AOP给你提供的帮助,你就需要向AOP提供你要进行业务能力增强的方法的路径,AOP找到这个方法就会对方法进行增强,在你调用方法的时候就会进行增强。

这下你总能理解什么是AOP了吧。

三、AOP中几个核心的方法注解

下边的代码我只使用的Around,其他的注解大家可以看看其他文章,或者自己试一下。

四、AOP中几个核心的属性

1.切入点(PointCut)

切入点就是用来描述我们到底要对哪个方法进行增强的,我们需要提供一串切入点需要的表达式。

切入点表达式的规则如下。

execution(modifier? ret-type declaring-type?name-pattern(param-pattern) throws-pattern?)
  • modifier:匹配修饰符,public, private 等,省略时匹配任意修饰符
  • ret-type:匹配返回类型,使用 * 匹配任意类型
  • declaring-type:匹配目标类,省略时匹配任意类型
    • .. 匹配任意的包及其子包
  • name-pattern:匹配方法名称,使用 * 表示通配符
    • * 表示所有的方法
    • set* 匹配名称以 set 开头的方法
  • param-pattern:匹配参数类型和数量
    • () 匹配没有参数的方法
    • (..) 匹配有任意数量参数的方法
    • (*) 匹配有一个任意类型参数的方法
    • (*,int) 匹配有两个参数的方法,并且第一个为任意类型,第二个为 int 类型
  • throws-pattern:匹配抛出异常类型,省略时匹配任意类型

 下边的PointCut注解就传入了一个切入点表达式。

@Pointcut(value = "execution(* com.example.shardingsphere.controller.*.*(..))")

五、代码演示

1.SpringBoot引入依赖

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.定义一个AOP,也就是切面类 

@Component
@Aspect
public class GlobalAspect {
    @Pointcut(value = "execution(* com.example.shardingsphere.controller.*.*(..))")
    public void pointCut(){}

    @Around(value =  "pointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object proceed = null;
        System.out.println("通知老板开始统计了");
        proceed = proceedingJoinPoint.proceed();
        System.out.println("告诉老板统计结果");
        return proceed;
    }
}

 ProceedingJointPoint类还有许多的方法可以使用,比如获取原来方法的参数等功能。以下内容来自转载。

public interface JoinPoint {  
   String toString();         //连接点所在位置的相关信息  
   String toShortString();    //连接点所在位置的简短相关信息  
   String toLongString();     //连接点所在位置的全部相关信息  
   Object getThis();          //返回AOP代理对象,也就是com.sun.proxy.$Proxy18
   Object getTarget();        //返回目标对象,一般我们都需要它或者(也就是定义方法的接口或类,为什么会是接口呢?
                              //这主要是在目标对象本身是动态代理的情况下,例如Mapper。所以返回的是定义方法的对象如
                              //aoptest.daoimpl.GoodDaoImpl或com.b.base.BaseMapper<T, E, PK>)
   Object[] getArgs();        //返回被通知方法参数列表  
   Signature getSignature();  //返回当前连接点签名。其getName()方法返回方法的FQN,如void aoptest.dao.GoodDao.delete()
                              //或com.b.base.BaseMapper.insert(T)(需要注意的是,很多时候我们定义了子类继承父类的时候,
                              //我们希望拿到基于子类的FQN,无法直接拿到,要依赖于
                              //AopUtils.getTargetClass(point.getTarget())获取原始代理对象,下面会详细讲解)
   SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置  
   String getKind();           //连接点类型  
   StaticPart getStaticPart(); //返回连接点静态部分  
  }  

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,
                        
原文链接:https://blog.csdn.net/feiying0canglang/article/details/120711774

同时在启动程序上加上注解。

@EnableAspectJAutoProxy

进行测试,我写了这样的一个方法。

@GetMapping("/test2")
    public String test(){
        System.out.println("开始统计公司工资情况");
        return "执行完毕";
    }

结果如下图所示。 

你能够看到,AOP已经成功的增强了我们原来的业务逻辑,这说明我们之后再也不用在我们的业务逻辑中进行这样的统计了,我们可以直接在切面类中进行功能的增强,并且切面类的代码可以复用,提高我们的开发效率。

3.使用自定义注解进行增强

每次想要增强一个方法我们就得写一个表达式,如果是有通配符的话还好说,但如果我们使用了通配符,那就说明可能对所有的方法进行增强,但有一些方法我不想进行增强,这可怎么办?没关系,我们可以使用自定义的注解来实现。

我们的表达式不在指向方法了,我们指向注解,哪个方法加了这个注解,哪个方法就需要增强。

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAspect {
}

修改表达式。也就是我们在哪里定义的这个注解。

@Pointcut(value = "@annotation(com.example.shardingsphere.aop.MyAspect))")

之后在我们的controller中的test方法上加上@MyAspect注解。进行测试。结果是一样的。

六、AOP实现的原理

这里就简单的说一下,AOP是通过Jdk动态代理或者Cglib动态代理实现的,我们调用我们需要增强的方法,实际上是调用了代理类的方法,由代理类真正的执行我们的业务逻辑。想了解jdk动态代理可以看看我的这篇博客【Java】jdk1.8 Java代理模式,Jdk动态代理讲解(非常详细,附带class文件)-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Milvus Cloud 向量数据库Reranker成本比较和使用场景

成本比较:向量检索 v.s. Cross-encoder Reranker v.s. 大模型生成 虽然 Reranker 的使用成本远高于单纯使用向量检索的成本,但它仍然比使用 LLM 为同等数量文档生成答案的成本要低。在 RAG 架构中,Reranker 可以筛选向量搜索的初步结果,丢弃掉与查询相关性低的文档,从而有…

电商技术揭秘三十九:电商智能风控技术架构设计

相关系列文章 电商技术揭秘相关系列文章合集&#xff08;1&#xff09; 电商技术揭秘相关系列文章合集&#xff08;2&#xff09; 电商技术揭秘二十八&#xff1a;安全与合规性保障 电商技术揭秘二十九&#xff1a;电商法律合规浅析 电商技术揭秘三十&#xff1a;知识产权保…

简单分享,豆瓣小组,可能被你忽视的获取精准流量渠道!

⾖瓣⼩组&#xff1a;精准流量的隐藏宝藏 探索互联网世界的每一个角落&#xff0c;你会发现总有那么一些被忽视的宝藏&#xff0c;等待着被发现者的光临。今天&#xff0c;我要和大家分享的这个宝藏&#xff0c;就是⾖瓣⼩组——一个你可能未曾注意到的精准流量渠道。 ⾖瓣平…

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包

本文来自&#xff1a;2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 - 源码1688 应用介绍 简介&#xff1a; 2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 自行检查后门&#xff0c;最好是部署智能合约后用合约地址来授权 包含转账支付页面盗U授…

蓝网科技临床浏览系统 deleteStudy SQL注入漏洞复现(CVE-2024-4257)

0x01 产品简介 蓝网科技临床浏览系统是一个专门用于医疗行业的软件系统,主要用于医生、护士和其他医疗专业人员在临床工作中进行信息浏览、查询和管理。 0x02 漏洞概述 蓝网科技临床浏览系统 deleteStudy接口处SQL注入漏洞,未经身份验证的恶意攻击者利用 SQL 注入漏洞获取…

HEVC/H.265视频编解码学习笔记–框架及块划分关系

前言 由于本人在学习视频的过程中&#xff0c;觉得分块单元太多搞不清楚其关系&#xff0c;因此本文着重记录这些分块单元的概念以及关联。 一、框架 视频为一帧一帧的图像&#xff0c;其编码的主要核心是压缩空间以及时间上的冗余。因此&#xff0c;视频编码有帧内预测和帧间…

TCP协议在物联网中实战

一、TCP协议介绍 网上对TCP协议介绍众多&#xff0c;本人按照自己的理解简单介绍一下。 TCP&#xff08;Transmission Control Protocol&#xff0c; 传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输控制层通信协议。 1.1 协议机制 1.1.1 三次握手 &…

面试重点1:打开网页点击URL,返回页面内容,从网络协议层面讲解一下

在这种场景下&#xff0c;从网络协议层面来讲解打开网页并点击 URL 的过程可以大致分为以下几个步骤&#xff1a; 1. DNS 解析 当你在浏览器中输入一个 URL&#xff08;例如 https://www.example.com&#xff09;&#xff0c;首先浏览器会进行 DNS 解析&#xff0c;将域名解析…

前端VUE项目中使用async()用法是为什么?能不用吗?

使用 async 关键字来定义一个函数主要有几个原因&#xff1a; 支持 await 关键字&#xff1a; async 函数允许你在其中使用 await 关键字&#xff0c;这使得你可以在不阻塞程序执行的情况下&#xff0c;等待一个异步操作&#xff08;如网络请求、文件读写等&#xff09;的完成。…

JAVA基础---Stream流

Stream流出现背景 背景 在Java8之前&#xff0c;通常用 fori、for each 或者 Iterator 迭代来重排序合并数据&#xff0c;或者通过重新定义 Collections.sorts的 Comparator 方法来实现&#xff0c;这两种方式对 大数量系统来说&#xff0c;效率不理想。 Java8 中添加了一个…

Python量化炒股的获取数据函数—get_concept()

查询股票所属的概念板块函数get_concept()&#xff0c;利用该函数可以查询一只或多只股票所属的概念板块&#xff0c;其语法格式如下&#xff1a; get_concept(security, dateNone)security&#xff1a;标的代码。类型为字符串&#xff0c;形式如‘000001.XSHE’&#xff0c;或…

邦注科技 模具清洗机 干冰清洗机 干冰清洗设备原理介绍

干冰清洗机&#xff0c;这款神奇的清洁设备&#xff0c;以干冰颗粒——固态的二氧化碳&#xff0c;作为其独特的清洁介质。它的工作原理可谓独具匠心&#xff0c;利用高压空气将干冰颗粒推送至超音速的速度&#xff0c;犹如一颗颗银色的流星&#xff0c;疾速喷射至待清洗的物体…

攻防世界XCTF-WEB入门12题解题报告

WEB入门题比较适合信息安全专业大一学生&#xff0c;难度低上手快&#xff0c;套路基本都一样 需要掌握&#xff1a; 基本的PHP、Python、JS语法基本的代理BurpSuite使用基本的HTTP请求交互过程基本的安全知识&#xff08;Owasp top10&#xff09; 先人一步&#xff0c;掌握W…

基准测试函数表达式--单峰函数与多峰函数

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

SSH和Telnet的区别

SSH&#xff08;Secure Shell&#xff09;和Telnet是两种网络协议&#xff0c;用于远程登录和管理计算机系统。但是它们有以下几个主要的区别&#xff1a; 安全性&#xff1a;SSH是一种加密的协议&#xff0c;可以向服务器传输加密的数据&#xff0c;以防止数据被窃听或篡改。而…

Arcade 用户界面滚动文本框

代码 import arcade from arcade import load_texture from arcade.gui import UIManager from arcade.gui.widgets import UITextArea, UIInputText, UITexturePaneLOREM_IPSUM ("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent eget pellentesqu…

探索互联网医院系统源码:在线问诊小程序开发教学

在线问诊小程序作为互联网医院系统的重要组成部分&#xff0c;为患者提供了更便捷、高效的医疗服务&#xff0c;成为了人们生活中不可或缺的一部分。今天&#xff0c;小编将带您探索互联网医院系统的源码&#xff0c;并介绍在线问诊小程序的开发教学&#xff0c;带领读者深入了…

【优质书籍推荐】Vue.js 3.x+Element Plus从入门到精通

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

JavaScript+C#云LIS系统源码JQuery+EasyUI+Bootstrap云LIS系统应用于哪些行业领域?区域云LIS系统源码

JavaScriptC&#xff03;云LIS系统源码JQueryEasyUIBootstrap云LIS系统应用于哪些行业领域&#xff1f;区域云LIS系统源码 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序&#xff0c;可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff0c;对区域内的检…

yo!这里是网络入门初识

目录 前言 基本概念 网络 协议 地址 网络传输流程 OSI七层模型 TCP/IP四层&#xff08;五层&#xff09;模型 流程图 数据封装&&分用 后记 前言 对于上一个专栏——Linux操作系统&#xff0c;我们学习了操作系统的基础知识以及基本的系统编程&#xff0c;其…