aspectj编程简介
现在java生态中spring大行其道,一般使用aspectj进行切面编程使用注解方式实现,比较少使用原生的aspectj编程,网上的资料也比较少。最近工作中需要封装redisson客户端提供统一的redis组件,主要就是实现耗时日志打印以及上报,压测支持等功能。为了避免组件依赖spring的情况,使用了aspectj原生库编程。工程基于jdk1.8。
1.aspectj介绍
aspectj定义(来自wiki):AspectJ是在PARC为Java编程语言创建的面向方面的编程扩展。它可以在Eclipse Foundation开源项目中使用,既可以单独使用,也可以集成到Eclipse中。
关于面向切面编程,这里不再赘述,一般用于实现通用的功能,比如日志打印,权限控制等。aspectj通过定义切面,将
2.配置以及使用
2.1配置
aspectj依赖两个核心库(aspectjrt,aspectjweaver),所以在需要在工程pom文件中添加一下依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
</dependency>
要使aspectj织入功能生效还需要添加aspectj-maven-plugin插件,配置如下。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.7</version>
<configuration>
<complianceLevel>1.8</complianceLevel>
<source>1.8</source>
<target>1.8</target>
<showWeaveInfo>true</showWeaveInfo>
<verbose>true</verbose>
<Xlint>ignore</Xlint>
<encoding>UTF-8</encoding>
<weaveDependencies>
<weaveDependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
</weaveDependency>
</weaveDependencies>
</configuration>
<executions>
<execution>
<goals>
<!-- use this goal to weave all your main classes -->
<goal>compile</goal>
<!-- use this goal to weave all your test classes -->
<!--<goal>test-compile</goal>-->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
aspectj可以选择织入的时期,主要分为三种:编译时,编译后,运行期。编译时织入只对织入代码在本工程的情况,编译后织入除了本工程代码还包括针对织入代码在第三方jar包情况,运行时织入只有在代码运行时才做动态切面。上面这个例子是编译后的配置,其中weaveDependencies配置了第三方jar包信息,只需要编译是织入可以不用配置。运行时织入参考(https://www.baeldung.com/aspectj)
2.2 aspect编写
切面类代码如下
/** * @date 2018/12/22
*/
public aspect CommandAspect { /**
* redis命令方法切面,所有redis命令都会经过
*/
public pointcut callSendCommand():
execution (* org.redisson.command.CommandAsyncService.sendCommand(..)); /**
* RedissonExpirable的所有子类方法切面,基本包含了redisson内置的常用数据结构
*/
public pointcut callExpireSubClassMethod():
execution (* org.redisson.RedissonExpirable+.*(..)); Object around(): callSendCommand() {
//long startNs = System.nanoTime();
Object result = proceed();
//AspectUtil.sendMetrics(startNs, thisJoinPoint);
return result;
} Object around(): callExpireSubClassMethod(){
Object result = proceed();
//AspectUtil.resetExpireTime(thisJoinPoint);
return result;
}
}
对于熟悉注解方式实现的同学可以发现,这种方式与注解方式十分相像,这里是实现了around,同样也支持before,after方式。在idea intellij调试时,无法在apsect类中断点,但是可以在其依赖的class类中断点,这对于我们第一次编码的时候存在一些困扰。
编码完成后,使用mvn compile命令,实现代码织入,之后就可以进行调试了
参考文档:
http://opoo.org/aspectj-compile-time-weaving/
https://www.baeldung.com/aspectj
aspectj编程简介的更多相关文章
- UNIX网络编程---简介
UNIX网络编程---简介 一. 概述 a) 在编写与计算机通信的程序时,首先要确定的就是和计算机通信的协议,从高层次来确定通信由哪个程序发起以及响应在合适产生.大多数 ...
- 《编程简介(Java) ·10.3递归思想》
<编程简介(Java) ·10.3递归思想> 10.3.1 递归的概念 以两种方式的人:男人和女人:算法是两种:递归迭代/通知: 递归方法用自己的较简单的情形定义自己. 在数学和计算机科学 ...
- win32编程简介
win32编程简介 复习Win32整理下知识. 为什么学习win32? 我们要编写windos程序.都离不开API. 也就是我们所说的win32程序. 所以学好win32是你能不能再windows下编 ...
- 【Unix网络编程】chapter3套接字编程简介
chapter3套接字编程简介3.1 概述 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换.多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数, ...
- 【Unix网络编程】chapter3 套接字编程简介
chapter3套接字编程简介3.1 概述 地址转换函数在地址的文本表达和他们存放在套接字地址结构中的二进制值之间进行转换.多数现存的IPv4代码使用inet_addr和inet_ntoa这两个函数, ...
- 黑客编程教程(二)Win API编程简介
第二节 Win API编程简介 下面介绍一下WIN API. 我们需要自己编写一个工具时,必然会用到很多操作windows和控制windows的函数,这些函数就是windows API. API是Ap ...
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. OpenCL安装 安装我不打算 ...
- 【在 Nervos CKB 上做开发】Nervos CKB脚本编程简介[2]:脚本基础
CKB脚本编程简介[2]:脚本基础 原文作者:Xuejie 原文链接:Introduction to CKB Script Programming 2: Script 本文译者:Shooter,Jas ...
- 【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[1]:验证模型
CKB 脚本编程简介[1]: 验证模型 本文作者:Xuejie 原文链接:Introduction to CKB Script Programming 1: Validation Model 本文译者 ...
随机推荐
- python - Random常用方法记录
import random # range [a,b) 不包含b # 获取随机整数 # randrange [a,b) 不包含b a = random.randrange(0, 101, 5) # E ...
- webdriver API
切换iframe 1.iframe有id和name driver.switch_to_frame(loc) 2.iframe无id和name 先用xpath定位找到iframe.再switch ifr ...
- webpack-dev-server的执行逻辑
1.运行npm i webpack-dev-server -D 把工具安装到项目的本地开发依赖 2.改工具用法跟webpack的用法完全一样:package.json中增加配置,直接用npm run ...
- HDU 5115 (杀狼,区间DP)
题意:你是一个战士现在面对,一群狼,每只狼都有一定的主动攻击力和附带攻击力.你杀死一只狼.你会受到这只狼的(主动攻击力+旁边两只狼的附带攻击力)这么多伤害~现在问你如何选择杀狼的顺序使的杀完所有狼时, ...
- HBase RegionServer Splitting 流程
RegionServer Splitting 实现 HBase 中的写请求由 Region Server 处理,这些数据首先存储在 memstore (RegionServer 里的一个存储系统)里. ...
- windows 定时备份linux 上oracle 数据库
1.bat 脚本 exp root/root@10.0.0.0:1521/feiye grants=y owner=root file='E:\code\environment\mysqlBackDa ...
- github项目上传与克隆
1. 先去git官网https://git-scm.com/下载git: 2. 桌面新建文件夹,例如project,文件夹中新建任意文件例如index.html: 3. 打开文件夹,按住shift+右 ...
- js 格式化带时区的日期
/** * 格式化带时区的日期 */ function formatDate(date) { var arr = date.split("T"); var d = arr[0]; ...
- 【期望dp】绵羊跳弹簧
[期望dp] 绵羊跳弹簧 >>>>题目 [题目] T 组数据.对于每一组数据,有n+1 个格子从0 到n 标号,绵羊从0 号结点开始,每次若在 x 位置掷骰子,令掷出的数为nu ...
- Wincc报表+Listview使用
listview在Wincc中可以作为显示的控件,对于列表表头的定义如下所示: list的命名,点击属性,在对象名称中对其定义: 有了listview的定义,就可以使用VBS对其表头的定义.具体代码如 ...