做者:小傅哥
博客:https://bugstack.cnphp
沉淀、分享、成长,让本身和他人都能有所收获!😄
话我放这,踩过的坑越多头发越少!
html
说来也是奇怪,只要是学编程的,从初次接触的 Java 到安装 JDK、IDEA、MYSQL, 再到接触 Spring、MyBatis、RPC、MQ,哪怕有时候在浅的坑也会跳进去尝尝鲜,一遍抓着头发,一手点着鼠标也几乎是你的常态。你的键盘里老是有不少被抓碎的头发!java
但,哪怕是抓了这么头发,仍是遇到了一个满脑子都是骚操做的小伙。“傅哥,个人切面怎么拦截不到?我是照着你的《SpringBoot 中间件设计和开发》专栏写的,你给我看看吧,我都弄了一天了”程序员
接下来我带着你们一块儿看看什么是快乐星球,他是怎么一顿骚操做让切面拦截不到的!编程
上周,谢飞机(化名)发过来了本身的手撸的中间件源码,说这代码都没有啥怎么就不能切面呢?api
看了几遍源码没发现问题,开始调试,还真它哈拉哨的不进这个切面,接下来;架构
个人目的要先让他跑起来,在研究。接下来我把本身的工程里的 DoJoinPoint
拷贝过来粘贴进去,噗察一下贴进去了,没提示替换,虽然有报错但两个类能共存,以下:eclipse
DoJoinPoint
不是一个正经 Java 类,路径不对?有看不见的特殊字符?要不是IDEA把 .aj
这货显示成 C 类的图标,可能早就发现问题了。紧接着把这错误类的截图发给了谢飞机,问它你是怎么建立的?他说实话了工具
DoJoinPoint
时,看到一个 Aspect 的选项,觉得这个就是建立切面的快捷操做,如图;.aj
结尾的类,并非一个正经的 Java 类,因此切面不到,也根本没有对应的 class 文件。AspectJ,简称 AJ 我本身说的开发工具
AspectJ 其实也是 AOP 的一种实现技术,功能相似于拦截器,在集成在 IntelliJ IDEA 开发工具里。在使用 IntelliJ IDEA 编写 AspectJ 代码以前须要本机先安装 AspectJ 工具包。不然你的 .aj 类不能运行,同时IDEA类显示出来的 .aj 类,也是C的标识
接下来咱们就来聊聊关于这个东西怎么使用,别再被 .aj 骗了。
在使用 AspectJ 以前,须要去官网下载一个安装包,地址:https://www.eclipse.org/aspectj/downloads.php 若是官网下载的很慢,能够从我提供的源码中获取,也能够从其余途径搜索下载 aspectj-1.9.4.jar
下载完成安装;
java -jar aspectj-1.9.4.jar
C:\aspectj1.9
,包括:bin、doc、lib等,后面咱们就会使用到这些内容。在专业版 IDEA 中开发 AspectJ,须要安装如下两个插件:
开始以前须要在项目中添加 aspectjrt.jar
依赖,aspectjrt.jar
即 AspectJ 安装目录中lib
目录下的jar包。你能够复制到工程中引入,也能够直接引入
Project Structure
IDEA 默认使用 javac
编译器,这里须要配置 AspectJ 的编译器 ajc
,在 IDEA 中作相应配置。
C:\aspectj1.9\lib\aspectjtools.jar
建立 Aspect 类
public aspect DoAspect { pointcut logPointcut():call(* ApiTest.hi(..)); void around():call(void ApiTest.hi(..)){ System.out.println("call 开始..."); proceed(); System.out.println("call 结束..."); } before(): logPointcut(){ System.out.println("方法执行 before"); } after(): logPointcut(){ System.out.println("方法执行 after"); } }
测试类
public class ApiTest { public void hi(){ System.out.println("Hi Aspect"); } public static void main(String[] args) { ApiTest apiTest = new ApiTest(); apiTest.hi(); } }
测试结果
call 开始... 方法执行 before Hi Aspect call 结束... 方法执行 after Process finished with exit code 0