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 本文译者 ...
随机推荐
- 复旦高等代数 I(18级)每周一题
[问题2018A01] 计算下列 $n+1$ 阶行列式的值: $$|A|=\begin{vmatrix} 0 & 1 & 1 & \cdots & 1 \\ 1 &a ...
- Ubuntu如何启用root用户登录
默认安装Ubuntu都是不允许以root用户进行登录的,想要以root用户进行登录需要进行一些操作,主要是以下几个步骤: 第一步 在终端输入命令:sudo passwd root 以普通用户登录系统, ...
- 如何搜索 git 提交记录
如何搜索 git 提交记录 git log -p --all -G '可通过正则搜索' --pretty=format:'%ci' # 可跨分支搜索 # -S '通过文本搜索' git branch ...
- 读书笔记--《编写高质量代码:改善Python程序的91个建议》
第一章 引论 建议写Pythonic式的代码,我理解为充分利用pythonAPI,用最简洁方式写出代码 1.两个变量交换: a, b = b, a 2.翻转list: a = [1, 2, 3, ...
- java native用法
说明: native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进行访问和操作,但是可以通过J ...
- 【细小碎的oi小知识点总结贴】不定时更新(显然也没人看qwq)
1.memcpy: 从a数组中复制k个元素到b数组: memcpy(b,a,sizeof(int)*k); #include<cstring> #include<iostream&g ...
- 网络爬虫&起点中文网完本榜500部小说
# 网络爬虫爬取起点中文网完本榜小说500部# 四步,分步操作,不易出错# 所需要获取的数据:书名 .作者.网址.类型.主要介绍.作品信息 from urllib.request import * # ...
- Oracle启用和禁用触发器
1.禁用 table_name 表的所有 trigger alter table table_name disable all triggers; 2.启用 table_name 表的所有 trigg ...
- git连接不上远程仓库---visualstudio提交代码报错:no upstream configured for branch 'master'
1,新建文件夹,在文件下下鼠标右键git bush--->git init,初始化仓库: 2,设置gitthub仓库地址:git remote add origin https://github ...
- js中for(var key in o ){};用法小记
o不只可以是对象,key也不只可以是对象中的键. o也可以是一个数组,这时候的key就是数组的下标,从"0"开始,注意下标“0”是个字符串类型. 但是这种循环在 IE8浏览器下 对 ...