【Spring AOP】

news2024/9/22 11:39:49

目录

🥗1 AOP 的思想

🍚2 AOP 的组成

🥚2.1 切面

🍙3 AOP 的实现

🍤3.1 添加 Spring AOP 依赖

🥫3.2 定义切面

🍣3.3 定义切点

🍳3.4 实现通知

🍔4 AOP 实现的一个例子


1 AOP 的思想

机场里有多家公司,但是安检是进候机室之前统一安排的,不需要不同航空公司各自安排一次安检。在计算机领域,也有类似的思想——AOP。

AOP(Aspect Oriented Programming):⾯向切⾯编程,它是⼀种思想,它是对某⼀类事情的集中处理。⽐如⽤户登录权限的效验,没学 AOP 之前,我们所有需要判断⽤户登录的⻚⾯(比如博客系统,所有需要用户登录的页面),都要各⾃实现或调⽤⽤户验证的⽅法,然⽽有了 AOP 之后,我们只需要在某⼀处配置⼀下,所有需要判断⽤户登录⻚⾯就全部可以实现⽤户登录验证了,不再需要每个页面都写相同的⽤户登录验证了。

AOP 是⼀种思想,⽽ Spring AOP 是⼀个框架,实现了 AOP 思想,两者之间的关系很像 MVC 与 Spring MVC 。

2 AOP 的组成

2.1 切面

切⾯(Aspect)由切点(Pointcut)和通知(Advice)组成。

切面:定义事件,也就是规定 AOP 要处理什么。比如用户登录效验

切点:定义具体规则,比如用户登录的拦截规则

通知:AOP 执行的具体方法,比如获取用户登录信息,如果已获取到说明已经登录了,否则就是未登录状态。

三者之间的关系类似于,公司的老板决定公司的业务是什么,而中层则来制定如何做事情的规则,最后由底层的劳动人民来实施具体的工作。

3 AOP 的实现

3.1 添加 Spring AOP 依赖

引入 Spring AOP 依赖:

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

3.2 定义切面

切面是一个类。需要两个注解。一个是 @Aspect ,表明该类是一个切面。

要让切面随着项目的启动而启动,因此要添加六大注解之一。这样才不会让那些在切面中定义的切点等方法,失去用处。

@Aspect //表明这个类是个 切面
@Component // 需要六大注解之一,以便在程序启动的时候便启动
public class UserAspect {
        ......
}

3.3 定义切点

切点表达式由切点函数组成,其中 execution() 是最常⽤的切点函数,⽤来匹配⽅法,语法为:

execution(<修饰符><返回类型><包名+类名+方法(参数)><异常>)

修饰符和异常通常可以省略。* 表示任意。 

拦截 包名+类名 的所有方法的返回值

    // 切点
    // 包名 + 类名
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){
    }

3.4 实现通知

通知的方法:

前置通知使⽤@Before:通知⽅法会在⽬标⽅法调⽤之前执⾏。 后置通知使⽤

@After:通知⽅法会在⽬标⽅法返回或者抛出异常后调⽤。 返回之后通知使⽤@AfterReturning:通知⽅法会在⽬标⽅法返回后调⽤。 抛异常后通知使⽤@AfterThrowing:通知⽅法会在⽬标⽅法抛出异常后调⽤。 环绕通知使⽤

@Around:通知包裹了被通知的⽅法,在被通知的⽅法通知之前和调⽤之后执 ⾏⾃定义的⾏为。

4 AOP 实现的一个例子

package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getuser")
    public String getUser(){
        System.out.println("do getUser");
        return "get user";
    }
}
package com.example.demo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/art")
public class ArticleController {
    @RequestMapping("/getart")
    public String getArticle(){
        System.out.println("do getArticle");
        return "getArticle";
    }
}

package com.example.demo.common;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Aspect //表明这个类是个 切面
@Component // 需要六大注解之一,以便在程序启动的时候便启动
public class UserAspect {
    // 切点
    // 包名 + 类名 
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut(){

    }

    // 前置通知
    // 需要指定切点的方法名,针对那个切点做出的具体方法实现。
    @Before("pointcut()")
    public void doBefore(){
        System.out.println("执行了前置通知");
    }

    // 后置通知
    @After("pointcut()")
    public void doAfter(){
        System.out.println("执行了后置通知");
    }

    // 环绕通知
    // 接受的参数类型一定是 ProceedingJoinPoint ,写死的
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("环绕通知执行之前");
        // 执行目标方法
        Object result = joinPoint.proceed();
        System.out.println("环绕通知执行之后");
        return result;
    }
}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法通关村第十七关:白银挑战-贪心高频问题

白银挑战-贪心高频问题 1. 区间问题 所有的区间问题&#xff0c;参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议&#xff0c;因此题目的本质是判断是否存在重叠区间 将区…

报错解决:RuntimeError: expected scalar type Long but found Float

文章目录 报错信息原因代码示例错误版改正 报错信息 RuntimeError: expected scalar type Long but found Float原因 nn.Linear需要作用于浮点数&#xff0c;这里可能输入了整数类型的张量作为参数。 代码示例 错误版 import torch import torch.nn as nn a torch.tensor…

53、springboot对websocket的支持有两种方式-------1、基于注解开发 WebSocket ,简洁实现多人聊天界面

基于注解开发 WebSocket –注解就是&#xff1a; OnOpen、 OnClose 、 OnMessage 、OnError这些 ★ WebSocket的两种开发方式 ▲ Spring Boot为WebSocket提供了两种开发方式&#xff1a; 基于spring-boot-starter-websocket.jar开发WebSocket 基于Spring WebFlux开发WebSoc…

常用消息中间件有哪些

RocketMQ 阿里开源&#xff0c;阿里参照kafka设计的&#xff0c;Java实现 能够保证严格的消息顺序 提供针对消息的过滤功能 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅机制 亿级消息堆积能力 RabbitMQ Erlang实现&#xff0c;非常重量级&#xff0c;更适…

只依赖OPENCV的工作服安全帽检测YOLOV8S

工地安全帽工作服检测Y8S&#xff0c;采用YOLOV8S训练模型&#xff0c;然后使用OPENCV的DNN调用&#xff0c;彻底拜托PYTORCH依赖&#xff0c;可以在C,PYTHON,ANDROID上跑。附件是C生成的效果测试&#xff08;只需解压将图片或者视频放入VIDEOS文件夹&#xff0c;文件夹没图片或…

宝宝餐椅儿童商品认证和ASTM F404检测标准的重要性

大家都知道儿童餐椅是宝宝饮食的重要伙伴。它们为宝宝提供了一个舒适的环境&#xff0c;让宝宝在吃饭的时候更愉快&#xff0c;更健康。然而&#xff0c;许多家长可能不知道&#xff0c;亚马逊美国站售卖的儿童餐椅需要进行一系列严格的认证&#xff0c;以保护我们宝贝们的安全…

平板触控笔哪款好用?好用的第三方apple pencil

而对于那些把ipad当做学习工具的人而言&#xff0c;苹果Pencil就成了必备品。但因为苹果Pencil太贵了&#xff0c;不少的学生们买不起。因此&#xff0c;最佳的选择还是平替电容笔&#xff0c;今天在这里整理了一些高性价比的电容笔&#xff01; 一、挑选电容笔的要点&#xf…

视频云存储/安防监控/AI分析/视频AI智能分析网关:占道经营算法

在国家倡导“地摊经济”的发展下&#xff0c;越来越多的人们投身于摆摊大潮&#xff0c;街道上都是随处可见的流动摊贩。虽然“地摊经济”有利于个人的经济增长&#xff0c;但有很多流动摊贩无视法规&#xff0c;随意摆摊或占道经营&#xff0c;这种行为不仅影响城市容貌&#…

Excel怎么批量生成文件夹

Excel怎么批量生成文件夹的链接: https://jingyan.baidu.com/article/ea24bc398d9dcb9b63b3312f.html

提升网络安全防御能力的几个方面

提升网络安全防御能力对于个人和组织来说都至关重要。网络安全是一个全面的概念&#xff0c;包括保护个人信息、防止恶意攻击和确保网络资源的安全。在这篇文章中&#xff0c;我将介绍几个方面来提高网络安全防御能力其中包括IP地址查询。 首先&#xff0c;IP地址查询是一种网…

Uniapp中使用uQRCode二维码跳转小程序页面

下载插件 uQRCode官网地址 引入插件 文件如下 //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode = {};(functio…

colab使用(基础入门)——随手记

挂载到google drive 挂载目录/content/drive from google.colab import drive drive.mount(/content/drive) 图解colab读取Google Drive 文件 - 知乎 下载文件 !curl -L https://dl.fbaipublicfiles.com/imagebind/imagebind_huge.pth -o imagebind_ckpt参数&#xff1a;[-…

案例精选|菏泽公共交通集团日志审计系统建设方案

菏泽公共交通集团有限公司成立于1977年&#xff0c;是市属国有大型公益性企业。随着公交优先政策的出台和企业内部改革的不断深化&#xff0c;菏泽公交集团事业有了飞速发展。 随着5G、大数据、人工智能等数字化技术不断深化应用&#xff0c;近年来菏泽公交集团持续推进智慧公…

简述视频智能分析EasyCVR视频汇聚平台如何通过“AI+视频融合”技术规避八大特殊作业风险

视频智能分析EasyCVR视频汇聚平台可以根据不同的场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;视频云存储平台EasyCVR可实现视频实时直播、云端录像、视频云存储、视频存储磁盘阵列、录…

动态内存申请

动态内存申请 静态分配 1、 在程序编译或运行过程中&#xff0c;按事先规定大小分配内存空间的分配方式。int a [10] 2、 必须事先知道所需空间的大小。 3、 分配在栈区或全局变量区&#xff0c;一般以数组的形式。 4、 按计划分配 动态分配 1、在程序运行过程中&#xff0c…

十八、MySQL添加外键?

1、外键 外键是用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性。 注意&#xff0c;主表被关联的字段类型&#xff0c;必须和副表被关联的字段类型一致。 2、实际操作 &#xff08;1&#xff09;初始化两张表格&#xff1a; &#xff08;2&#x…

线程、并发相关---第六篇

系列文章目录 文章目录 系列文章目录一、为什么用线程池?解释下线程池参数?二、简述线程池处理流程一、为什么用线程池?解释下线程池参数? 1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。 2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线…

银行卡四要素验证API接口文档:支持手机号归属地验证

随着互联网和电商业务的不断发展&#xff0c;人们对于数字化支付方式的需求越来越强烈&#xff0c;因此银行卡验证成为了重要的支付安全措施。银行卡四要素验证API接口&#xff0c;就是为了解决这一问题而开发的。本文将针对银行卡四要素验证API接口&#xff0c;以支持手机号归…

Jetsonnano B01 笔记2:GPIO库-Pycharm远程调试-点灯

今日继续我的Jetsonnano 学习之路,今日主要学习使用Pycharm远程调试Jetsonnano以及驱动使用Jetsonnano的GPIO库&#xff0c;最终尝试使用jetson点亮第一个LED。 本文搬运成分较多&#xff0c;因为Jetsonnano资料比较少&#xff0c;做这些笔记方便自己以及大家查阅。 目录 一…

什么是IIFE(Immediately Invoked Function Expression)?它有什么作用?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐IIFE 的基本语法⭐IIFE 的主要作用⭐如何使用 IIFE 来创建私有变量和模块封装⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅…