AspectJ简介及实例
所属分类 architecture
浏览量 1128
SpringAOP 与 AspectJ
SpringAOP只是 依赖了 AspectJ 的注解,并没有依赖 AspectJ 实现具体的功能
SpringAOP 只对方法调用有效 ,
运行时生成动态代理类,基于 jdk动态代理 或 cglib 实现
AspectJ 3种 织入方式
compile-time 编译期织入,直接编译出包含织入代码的 class 文件
post-compile 编译后织入,增强已经编译出来的类
load-time 进行类加载时进行织入 , 基于 javaagent
织入代码 两种写法
AspectJ 语法 .aj
java注解 @Aspect
例子只用了 java注解 @Aspect
编译时织入
利用插件编译 aspectj-maven-plugin
maven 命令行编译 (不要用IDE自动编译)
mvn clean package
@Aspect
public class LogAspect
编译后织入
依赖第三方jar包
只能采用 编译后 织入
利用插件编译 aspectj-maven-plugin (配置外部依赖)
maven命令行编译
mvn clean package
本地项目生成织入之后的 class
Tiger.class jvm优先加载该类 , 覆盖 第三方jar包里的同名类
@Aspect
public class LogAspect
1.8
dyyx
aspectjshare
JVM运行时织入
利用javaagent机制
@Aspect
public class LogAspect
-javaagent:/PATH/aspectjweaver-1.9.0.jar
src/main/resources/META-INF/aop.xml
日志信息
[AppClassLoader@18b4aac2] info AspectJ Weaver Version 1.9.0 built on Monday Apr 2, 2018 at 17:17:56 GMT
[AppClassLoader@18b4aac2] info register classloader sun.misc.Launcher$AppClassLoader@18b4aac2
[AppClassLoader@18b4aac2] info using configuration /Users/dyyx/work/demos/aspectj/loadtime/target/classes/META-INF/aop.xml
[AppClassLoader@18b4aac2] info register aspect dyyx.LogAspect
aspectj load time demo,2021-02-03T09:08:18.260
[AppClassLoader@18b4aac2] weaveinfo Join point 'method-execution(java.lang.String dyyx.Pet.sayHello(java.lang.String))' in Type 'dyyx.Pet' (Pet.java:6) advised by around advice from 'dyyx.LogAspect' (LogAspect.java)
loadtime weave ,before,execution(String dyyx.Pet.sayHello(String))
loadtime weave ,after,execution(String dyyx.Pet.sayHello(String))
hello,tiger
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class LogAspect {
@Pointcut("execution(* dyyx.Pet.sayHello(..))")
public void log() {}
@Around("log()")
public Object doLog(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("before,"+joinPoint);
Object result = joinPoint.proceed();
System.out.println("after,"+joinPoint);
return result;
}
}
aop.xml
完整例子代码
https://gitee.com/dyyx/demos/tree/master/aspectj
4个项目说明
share 模拟第三方jar包,给编译后织入使用
compile 编译时织入例子
compilepost 编译后织入,依赖 share
loadtime jvm运行时织入
javaagent机制
java agent 简单例子
javaagent两种加载方式及实例
AOP要点整理
AOP知识点
spring aop 与 aspectj的区别和联系
基于Aspect注解的spring aop 实例
Java字节码增强简介
上一篇
下一篇
springboot应用首次访问慢解决方法
SpringMVC consumes 和 produces 用法
SpringMVC 数据验证
Jackson JSON的三种处理方式
Springboot监控端点Actuator实例
SpringIoC容器要点