首页  

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 <configuration> <complianceLevel>1.8</complianceLevel> <weaveDependencies> <weaveDependency> <groupId>dyyx</groupId> <artifactId>aspectjshare</artifactId> </weaveDependency> </weaveDependencies> </configuration>
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 <!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> <aspectj> <aspects> <aspect name="dyyx.LogAspect"/> <weaver options="-verbose -showWeaveInfo"> <include within="dyyx..*"/> </weaver> </aspects> </aspectj>
完整例子代码 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容器要点