AOP的一点浅薄理解

news2024/11/17 11:22:03

AOP思想应该怎么去理解!

Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point(连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut(切点):表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice(增强):Advice 定义了在 Pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
Target(目标对象):织入 Advice 的目标对象。
Weaving(织入):将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程

以下仅代表个人理解

个人理解,Join point就是需要Advice的方法,而切面操作可能要对大量的类进行Advice,所以就要先声明这些所有的Join point,可以这么理解Pointcut切点是所有Join point连接点的集合,Join point 是Pointcut的真子集,Pointcut可以使用通配符,这样就降低Join point的声明成本,即没有Pontcut或者说Pointcut不是必须的,必须的是Join point,指代需要进行切面处理的方法
总结,Join point指代需要进行切面处理的方法,Pointcut是所有需要进行切面处理的方法,Advice是对方法进行的处理(即增强操作,与业务无关,如日志打印,全局异常拦截,统一返回值,多数据源的切换等)
个人认为最难理解的点可能就是命名,真是莫名其妙,我之前学习的时候就一直没搞明白切点,连接点,叫切线还差不多,线是点的集合,哈哈
要我命名的话,我要把Join point 命名为处理点handle point,Pointcut命名为切入点集(英文还没想好),Advice通知,叫这名也行,可以理解为通知Join point,要对其进行增强了,只能这么强行理解了

dependencies 依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!-- aop 依赖, aspectj -->
 <!-- 无此依赖,切面类无法声明,即无法使用@Aspect注解 -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>

controller

写一个简单的接口,能被外部访问就行

@Controller
@RequestMapping("/demo")
public class AopController {
    @Autowired
    private TestAopService testAopService;

    @RequestMapping("/aop")
    public void testAop() {
        testAopService.testAop();
    }
}

service

需要增强(插入与业务逻辑无关的代码)的类

@Service
@Slf4j
public class TestAopService {
    public void testAop() {
        log.info("test service start");
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.forEach(System.out::println);
        log.info("test service end");
    }
}

aspect

切面类,声明切面,并进行增强操作

//声明一个切面类,或者说将此类声明为切面
@Aspect
//要加上这个注解,才会注入到Spring容器,@Service及@Controller等都可理解为此注解的子注解
@Component
@Slf4j
public class TestAopServiceAspect {

	//此方法相当于一个变量用来装execution(* com.java.aop.service.TestAopService.*(..))
	//使用@Pointcut,现在才有点理解为啥切点是多个JontPoint了,因为此表达式是个通配的,说明可以在多处()起作用
    @Pointcut("execution(* com.java.aop.service.TestAopService.*(..))")
    public void pointcut(){};//此方法名称可以任意,比如test()或者aop(),当然对应的下面注解里的也要改

	//@Around("execution(* com.java.aop.service.TestAopService.*(..)")
    @Around("pointcut()")
    //ProceedingJoinPoint 我的理解是正在执行的连接点,即方法调用,以此指代需要进行切面处理的方法
    public void testAopHandle(ProceedingJoinPoint proceedingJoinPoint) {
        log.info("aop start");
        try {
            proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            log.info("server error");
        }
        log.info("aop end");
    }
}

浏览器访问: 未更改端口直接点击此链接

result

效果如下
在这里插入图片描述

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

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

相关文章

C语言学习笔记-变量

我们知道每一个程序的运行都需要内存&#xff0c;那么C语言的变量的定义是什么含义呢&#xff1f; 假如我花了200元买了一块4G内存条&#xff0c;然后我定义了一个int a ;就意味着从这4G的内存上要拿走4个字节&#xff0c;又定义了一个int b&#xff1b;那么b同样也要从4G的内存…

【OpenGL学习】OpenGL实现 基于Phong模型的基础光照

基于Phong模型的基础光照 在本节中&#xff0c;我们将利用 Phong 光照模型来完成一个简单的光照场景的渲染。 一、Phong 光照模型 Phong光照模型是20世纪70年代被提出的一种渲染逼真图像的方法&#xff0c;模型的提出者是越南出生的计算机图形学研究员Bui Tuong Phong&#…

JavaScript中的String和自定义对象~

String对象&#xff1a; 它是 JavaScript 的一种基本的数据类型 String 对象的 length 属性声明了该字符串中的字符数&#xff0c;String 类定义了大量操作字符串的方法&#xff0c;例如从字符串中提取字符或子串&#xff0c;或者检索字符或子串 需要注意的是&#xff0c;Ja…

单行文本域,多行文本域隐藏问题

多行文本域隐藏问题 overflow: hidden; 首先是溢出隐藏&#xff0c;不可或缺 display: -webkit-box; 以弹性盒模型显示 -webkit-box-orient: vertical; 盒模型元素的排列方式 -webkit-line-clamp: 3; 显示行数 <style>.postnameStyle{font-size: 30rpx;font-weight: …

【科研】ET-BERT资料库梳理

作者原repo链接 https://github.com/linwhitehat/ET-BERT 0.资料总库 分为数据模型语料库 1.数据集 包含fine-tuning数据集&#xff08;cstnet-tls 1.3&#xff09;与公开数据集&#xff08;USTC-TFC、VPN-app、VPN-service的数据包级和流级&#xff09;目录链接 1.1 微调…

【博客602】net.ipv4.conf.eth0.route_localnet的作用

net.ipv4.conf.eth0.route_localnet的作用 背景&#xff1a;默认情况下不能将本机的请求跳转/转发到回环接口上 在某些场景下会用在一台主机内网络流量重定向&#xff0c;比如将在本机回环设备中的数据包强行转发到另一台主机上。结果发现原本在正常的NAT场景中生效的iptables…

windbg抓一个windows蓝屏分析

前言 设备一直以来挺稳定&#xff0c;但还是小概率事件意外出现某设备突然蓝屏了。查看windows事件查看器提示计算机已经从检测错误后重新启动。检测错误: 0x0000009f (0x0000000000000003, 0xffffad0f4edc7570, 0xfffff8046a09ec20, 0xffffad0f4ef318a0)。已将转储的数据保存…

搭建不同网络训练MNIST

问题在之前的学习过程中&#xff0c;我们学习了如何搭建全连接神经网络训练Mnist数据集。初始时&#xff0c;全连接神经网络训练结果验证集和训练集的精确度不高&#xff0c;在对数据进行归一化&#xff0c;调参等操作提高了精确度。我们这次使用Le-Net5和VGG对MNIST进行训练&a…

STM32—串口

串口介绍 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#xff0c;只…

.NET MAUI 安卓 UI 资源设置

本文主要介绍使用 MAUI 开发安卓应用时&#xff0c;如何更换和处理 UI 资源&#xff1a;应用名称&#xff0c;图标&#xff0c;主题配色&#xff0c;状态栏&#xff0c;闪屏。 文章目录1. 背景2. 资源设置2.1 项目创建2.2 应用名称2.3 应用图标2.4 应用闪屏2.5 沉浸式状态栏1. …

通用智能如何拥有生命的简单设计

如第一个图所示 是和环境交互的时候 行为交互时间和环境反馈时间T0 T1 还有行为消耗能量E0 环境反馈能量E1 如图有四种情况 其中反馈时间T1小于交互时间T0的任务是积极反馈 和打游戏一样要及时反馈才能提起兴趣 这个是整个行为交互过程中最小的记录单元 图二的每个元素都代表多…

STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-

记录项目的详细制作过程&#xff0c;所以笔记很长&#xff0c;图很多、很多图不好CSDN搬运&#xff0c; 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接&#xff1a;https://pan.baidu.com/s/1Mk2EVIha7Fpj4Xductg3Uw?pwdVCC1 提取码&#xff1a;VCC1 笔记CSDN下载:…

C++11 入门

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍C11的一些背景知识 本篇博客主要是讲解一些关键字 C11前言C11诞生简介列表初始化{}初始化关键字autodecltypenullptr范围forSTL的更…

技术开发117

技术开发117 业务内容&#xff1a; 半导体制造设备零件&#xff08;阀门零件、管件&#xff09;、汽车的各种功能部件&#xff08;发动机、动力转向器、空调、刹车和传动系统&#xff09;、 建筑和工业设备部件、电信设备的零件、气动特殊气缸、供热和制冷系统的零件、其他一…

CAD中怎么绘制攒尖屋顶?CAD设计攒尖屋顶技巧

在给排水CAD设计中&#xff0c;有些时候为了需要会在图纸中绘制攒尖屋顶&#xff0c;那么你知道CAD软件中怎么构造攒尖屋顶三维模型吗&#xff1f;其实很简单&#xff0c;浩辰CAD给排水软件中提供了实用的攒尖屋顶功能&#xff0c;下面就和小编一起来看看浩辰CAD给排水软件中CA…

Android RCLayout 圆角布局,支持边框,渐变色,渐变色方向等

RCLayout 圆角布局,支持边框,渐变色,渐变色方向等 支持布局 RcRelativeLayout RcLinearLayout RcFrameLayout RcConstraintLayout RcAbsoluteLayout RcTextView 引入 implementation com.github.IHoveYou:RCLayout:1.0.1 项目地址 链接: github 布局属性 <!-- 背景色/渐…

Java-基础-1.异常

一&#xff1a;异常架构 Error 类层次描述了 Java 运行时系统内部错误和资源耗尽错 误。这类错误是我们无法控制的&#xff0c;同时也是非常罕见的错误。所以在编程中&#xff0c;不去处理这类错误。Error 表明系统 JVM 已经处于不可恢复的崩溃状态中。我们不需要管他。 如:写代…

电商前台项目(五):完成加入购物车功能和购物车页面

Vue2项目前台开发&#xff1a;第五章一、加入购物车1.路由跳转前先发请求把商品数据给服务器&#xff08;1&#xff09;观察接口文档&#xff08;2&#xff09;写接口&#xff08;3&#xff09;dispatch调用接口传数据&#xff08;4&#xff09;判断服务器是否已经收到商品数据…

Spring-相关概念入门

Spring-相关概念&入门 2&#xff0c;Spring相关概念 2.1 初识Spring 在这一节&#xff0c;主要通过以下两个点来了解下Spring: 2.1.1 Spring家族 官网&#xff1a;https://spring.io&#xff0c;从官网我们可以大概了解到&#xff1a; Spring能做什么:用以开发web、微服…

六、附近商户,连续签到,UV统计

文章目录附近商户GEO的基本用法导入店铺数据到GEO实现附近商户功能签到BitMap的基本用法实现签到功能实现连续签到统计功能补充&#xff1a;Java中>>和>>>的区别UV统计HyperLogLog的基本用法测试百万数据的统计官方命令文档&#xff1a;https://redis.io/comman…