diff --git a/java/使用LoadTimeWeaving技术实现AOP功能.md b/java/使用LoadTimeWeaving技术实现AOP功能.md new file mode 100644 index 0000000..cd60ce8 --- /dev/null +++ b/java/使用LoadTimeWeaving技术实现AOP功能.md @@ -0,0 +1,245 @@ +## 使用LTW(LoadTimeWeaving)技术实现AOP功能 + +### aop增强分类 + +###### 编译时: + +使用特殊的编译器在编译期将切面织入目标类,这种比较少见,因为需要特殊的编译器的支持。例如,AspectJ编译 器,很少有到,目前我还没有用到。 + +###### 加载时: + +通过字节码编辑技术在类加载期将切面织入目标类中,它的核心思想是:在目标类的class文件被JVM加 载前,通过自定义类加载器或者类文件转换器将横切逻辑织入到目标类的class文件中,然后将修改后class文件交给JVM加载 这种织入方式可以简称为LTW(LoadTimeWeaving),AspectJ的LoadTimeWeaving (LTW) + +###### 运行时: + +运行期通过为目标类生成动态代理的方式实现AOP就属于运行期织入,这也是Spring AOP中的默认实现,并且提供了两种创建动态代理的方式:JDK自带的针对接口的动态代理和使用CGLib动态创建子类的方式创建动态代理。 + + + +### 优劣势 + +编译时:需要特殊的编译器 + +加载时:需要特殊的类加载器 + +运行时:功能有限 + + + +### 使用LTW 切面第三方JAR 包(普通maven项目) + +#### 配置文件 + +##### pom 文件 + +```xml + + + 4.0.0 + + cn.x47.blog + LoadTimeWeaving-demo + 1.0 + + + java-aspectj-agent + 1.0 + jar + + + + com.alibaba + fastjson + + + org.aspectj + aspectjweaver + + + + + + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + maven-assembly-plugin + + + jar-with-dependencies + + + + cn.x47.ltw.Main + + + + + + make-assembly + package + + single + + + + + + + + +``` + + + +##### aop.xml + + 放在`META-INF/aop.xml` + +``` + + + + + + + + + + + + + +``` + + + +### 目录结构 + +![image-20220828130642183](http://pic.61dz.com/pic/image-20220828130642183.png) + + + + + +### 执行方法 + +##### 开发环境 + +可以通过添加jvm参数的方式来启动 + +![image-20220828123756596](http://pic.61dz.com/pic/image-20220828123756596.png) + + + + + + + +### springboot 使用 LTW切面第三方JAR包 + +#### 配置文件 + +##### pom配置 + +``` + + + 4.0.0 + + cn.x47.blog + LoadTimeWeaving-demo + 1.0 + + + springboot-aspectj-agent + 1.0 + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + com.alibaba + fastjson + 2.0.12 + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.aspectj + aspectjweaver + 1.9.9 + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + +``` + + + +##### oop配置 + +``` + + + + + + + + + + + + +``` + +#### 目录结构 + +![image-20220828135835641](http://pic.61dz.com/pic/image-20220828135835641.png) + + + + + + + +### 源码地址 + +https://git.dr1997.com/chenkuangwei/LoadTimeWeaving-demo \ No newline at end of file