AspectJ入门(一)

 AspectJ是一个面向切面的框架,扩展了Java语言。有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。Spring的AOP底层也是用了这个框架。

AOP可以拦截指定的方法并对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

join point

连接点

是在程序中已经定义好的点。

pointcuts

切点

挑选这些连接点及取值。动态影响程序流程。

advice

通知/处理

对连接点进行增强的部分,动态影响程序流程。

inter-type declarations

类系间声明

允许程序员修改程序的静态关系,即程序的类的成员和类之间的关系。

aspects

切面

封装上面这些结构。

表 AspectJ中的相关概念

1 idea 运行AspectJ

1,下载并安装AspectJ编译器。下载连接。

图 Mac系统下安装AspectJ编译器

2,在idea中安装AspectJ及AOP Pointcut Language插件。

图 idea 中安装相关插件

3,在项目中,编译器配置选择AJC。

图 Java编译器配置

4,添加AspectJ依赖

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.6</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.5</version>
</dependency>

5,创建Aspect文件,Aspect的大致语法和Java一样。(如果在点击new时没有发现Aspect选项,则选择“File”类型,并把后缀改为.aj。)

图 点击new时可创建的文件类型部分截图

2 pointcuts

切点是用来挑选连接点的。

call(void article.service.ShopService.showGoods(String)):表示service包下的ShopService类,方法名为showGoods,有一个String类型参数,返回值为void方法的切点。

切点还可以使用逻辑运算符(&&,||及!)及通配符表示:

before():call(void article.service.ShopService.showGoods(String)) || call(void article..say*(..)) {System.out.println("这是一个通知");
}

表示service包下的ShopService类,方法名为showGoods,有一个String类型参数,返回值为void的方法或者是article包下,方法名以say开头,返回值为void的方法的切点。

2.1 命名切点

命名切点格式为:pointcut 切点名():切点表达式

public aspect ShopAspect {pointcut shopPointcut(): call(void article.service.ShopService.showGoods(String)) || call(void article..say*(..));before():shopPointcut() {System.out.println("这是一个通知");}
}

2.2 引入与织入

引入,introduction,向现有的类添加新的方法或者属性。

织入,weaving,把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。

图 切面的目标对象类的反编译代码

2.3 获取程序流中的所有连接点 cflow

cflow获取特定连接点之后在程序控制流程内遇到的所有连接点。(每行代码编译后的字节码都属于连接点)

cflowbelow与cflow用法是一样的,唯一的区别是cflowbelow不包括初始连接点。

public aspect SimpleAspect {before():cflowbelow(call(* article.flow.AObject.methodA())) && !within(SimpleAspect) {System.out.println("连接");}
}public class AObject {public static void methodA() {System.out.println("hello");}public static void main(String[] args) {AObject.methodA();}
}
//运行结果
//连接A
//连接A
//连接A
//hello

3 Advice

通知是增强指定连接点(目标方法)的代码片段。

before()

在目标方法调用之前执行。

after()

在目标方法返回或异常后调用。

after() returning:

在目标方法返回后调用。

after() throwing:

在目标方法异常后调用。

around

会将这个目标方法封装起来。

表 通知的5种位置

public aspect AdviceAspect {after() throwing: call(void article.service.AdviceService.methodThrowing(..)) {System.out.println("methodThrowing通知");}
}public class AdviceService {public void methodThrowing() {System.out.println("开始执行方法");throw new RuntimeException();}public static void main(String[] args) {AdviceService adviceService = new AdviceService();adviceService.methodThrowing();}
}

图 运行结果

3.1 从切点中获取上下文信息

通知可以从切点那获取并使用连接点的方法参数和目标对象等上下文信息。

public aspect ContextAspect {after(ContextService contextService, String argName, int argNum): call(String article.service.ContextService.contextInfo(String,int))&& args(argName,argNum) && target(contextService){System.out.println("织入:argName:" + argName + ";argNum:" + argNum);System.out.println(contextService);}
}public class ContextService {public String contextInfo(String name, int num){System.out.println("hello:" + name + "," + num);return "temp";}public static void main(String[] args) {ContextService contextService = new ContextService();contextService.contextInfo("word",999);}
}

使用命名切点时,如果需要在通知中获取上下文,则需要在命名切点调用时指出这些参数名。

public aspect ContextAspect {pointcut argPoint(ContextService contextService, String argName, int argNum): call(String article.service.ContextService.contextInfo(String,int))&& args(argName,argNum) && target(contextService);after(ContextService contextService, String argName, int argNum): argPoint(contextService,argName,argNum){System.out.println("织入:argName:" + argName + ";argNum:" + argNum);System.out.println(contextService);}
}

4 类型间声明

AspectJ可以静态改变类的结构(新增方法、成员变量及构造函数),也可以更改类之间的继承关系。

需求:对于已经写好的Shop类,我们希望通过AspectJ增加记录访客信息及对每位客户到店进行提醒的功能。

public aspect ShopAspect {public List<String> Shop.visitInfos = new ArrayList();public static void addInfo(Shop shop,String info) {shop.visitInfos.add(info);}before(Shop shop,String customName,String gender):call(void article.entity.Shop.visit(String,String)) && args(customName,gender) && target(shop){System.out.println("欢迎光临:" + customName);String info = "姓名:" + customName + ";性别:" + gender + ";到访时间:" + new Date();addInfo(shop,info);}after(Shop shop): call(void article.entity.Shop.summary()) && target(shop){System.out.println(shop.visitInfos);}
}public class Shop {public void visit(String customName,String gender) {System.out.println(customName + "进入店铺");}public void summary() {System.out.println("店铺一天总结。");}public static void main(String[] args) throws InterruptedException {Shop shop = new Shop();shop.visit("黄先生","男");Thread.sleep(1000*10);shop.visit("刘女士","刘女士");shop.summary();}
}

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

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

相关文章

机器学习之实验过程01

import pandas as pd import numpy as np import matplotlib.pyplot as plt data_path /home/py/Work/labs/data/SD.csv # 请确保您的数据文件路径是正确的 df pd.read_csv(data_path) df.head() # 创建散点图 # 创建散点图 plt.figure(figsize(10, 6)) plt.scatter…

MySQL 数据库系列课程 05:MySQL命令行工具的配置

一、Windows启动命令行工具 &#xff08;1&#xff09;打开 Windows 的开始菜单&#xff0c;找到安装好的 MySQL&#xff0c;点击MySQL 8.0 Command Line Client - Unicode&#xff0c;这个带有 Unicode 的&#xff0c;是支持中文的&#xff0c;允许在命令行中敲中文。 &…

三网合一建设方案

一、什么是三网融合&#xff1f; 三网合一&#xff08;即三网融合&#xff09;&#xff0c;是指电信网、广播电视网和互联网的相互渗透、互相兼容、并逐步整合成为统一的信息通信网络&#xff0c;其中互联网是核心。只需要引入三个网络中的一个&#xff0c;就能实现电视、互联…

Java架构师系统架构需求分析实战

目录 1 导语2 需求分析实战3 核心方法论-架构立方体4 功能性模型-模块定义5 功能性模型-模块关系图6 功能性模型-模块细化 想学习架构师构建流程请跳转&#xff1a;Java架构师系统架构设计 1 导语 架构设计的实战和思维方法的讨论&#xff0c;主要聚焦于需求分析的重要性和方…

openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析

文章目录 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表 执行计划生成器需要使用表的统计信息&#xff0c;以生成最有效的查询执行计划&#…

c# OpenCvSharp 检测(斑点检测、边缘检测、轮廓检测)(五)

在C#中使用OpenCV进行图像处理时&#xff0c;可以使用不同的算法和函数来实现斑点检测、边缘检测和轮廓检测。 斑点检测边缘检测轮廓检测 一、斑点检测&#xff08;Blob&#xff09; 斑点检测是指在图像中找到明亮或暗的小区域&#xff08;通常表示为斑点&#xff09;&#…

电子科大软件系统架构设计——设计模式

设计模式概述 设计模式的背景 设计面向对象软件比较困难&#xff0c;而设计可以复用的面向对象软件更加困难不是解决任何问题都需要从头做起&#xff0c;最好能复用以往的设计方案经验面向对象软件设计经验需要有一定的模式记录下来&#xff0c;以提供给其他设计者使用&#…

搭建Nginx文件下载站点

一、下载Nginx 首先&#xff0c;确保你的服务器上已经安装了Nginx&#xff0c;使用编译安装&#xff0c;下载最新版Nginx。 wget https://nginx.org/download/nginx-1.25.3.tar.gz tar -xf nginx-1.25.3.tar.gz二、安装Fancyindex和Nginx-Fancyindex-Theme模块 # 下载Fancyin…

如何使用 YOLOv8 做对象检测

介绍 对象检测是一项计算机视觉任务&#xff0c;涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分&#xff0c;例如自动驾驶汽车、机器人和视频监控。 多年来&#xff0c;已经开发了许多方法和算法来查找图像中的对象及其位置。卷积神经网络对于此类任务有着非…

uni-app 工程目录结构介绍

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

[kubernetes]控制平面ETCD

什么是ETCD CoreOS基于Raft开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;etcd像是专门为集群环境的服务发现和注册而设计&#xff0c;它提供了数据TTL失效、数据改变监视、多值、目录监听、…

MyBatis:Generator

MyBatis Generator附批量操作分页查询存储过程 Generator 介绍网址&#xff1a;Introduction to MyBatis Generator Generator &#xff0c;一个用于 MyBatis 的代码生成工具&#xff0c;可以根据数据库表结构自动生成对应的实体类、DAO 接口和 SQL 映射文件&#xff0c;提高…

智能优化算法应用:基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于协作搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.协作搜索算法4.实验参数设定5.算法结果6.…

自媒体实战篇:剪辑软件应用与实操

剪辑软件应用与实操 剪映基础界面认识 素材面板 导入本地素材,剪映自带素材库,音频,文本等素材合集面板播放预览 预览本地素材,,剪映自带素材库以及时间线面板中的素材的实时效果时间线面板 对素材进行基础的编辑操作,调整素材轨道等素材功能面板 可对素材或者文本等精细…

智能优化算法应用:基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工蜂鸟算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.…

VMvare虚拟机之文件夹共享防火墙设置

目录 一.jdk的配置&TomCat的配置 1.1 jdk配置 1.2 tomcat配置 二.文件夹共享功能 2.1 作用 2.2.高级共享和普通共享 三.防火墙设置 3.1 入站规则和出站规则 四.附图-思维导图 一.jdk的配置&TomCat的配置 建立一个共享文件夹&#xff0c;将jdk文件和tomcat文…

Java中的内部类、枚举

内部类、枚举 内部类成员内部类静态内部类局部内部类&#xff08;不重要&#xff09;匿名内部类&#xff08;重要&#xff09;什么是匿名内部类使用场景 枚举类什么是枚举类枚举类的特点枚举类提供的一些额外API拓展&#xff1a;抽象枚举使用枚举类实现单例设计模式 常见应用场…

thinkphp6.0的workerman在PHP8.0下报错

一、我先升级了thinkphp6.0到最新版本&#xff1a; composer update topthink/framework二、结果提示我composer版本过低&#xff0c;需要升级到2&#xff0c;于是我又升级了composer composer self-update 三、我又升级了workerman: composer require topthink/think-work…

Unity 获取当前日期的短时间和处于早中午晚哪个时间段

在我们手机中我们总会看到下图所示的时间&#xff0c;时间段当前时间&#xff0c;假如我们要实现这个效果应该怎么做呢。 首先是使用DateTime.Now获取当前时间&#xff1a; // 获取当前时间DateTime currentTime DateTime.Now; 其次由当前时间获取短时间&#xff0c;可以使用…

Intel FPGA 技术开放日

概要 时间&#xff1a;2023.11.14 全天 &#xff08; 9:00 - 16: 20&#xff09; 地点&#xff1a;北京望京. 凯悦酒店 主题内容&#xff1a;分享交流了Intel FPGA 产品技术优势和落地实践方案。 会议的议程 开场致词&#xff1a; FPGA业务&#xff0c;是几年前intel收购而…