## 使用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` ```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配置 ```xml 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配置 ```xml ``` #### 目录结构 ![image-20220828135835641](http://pic.61dz.com/pic/image-20220828135835641.png) ### 源码地址 https://git.dr1997.com/blog/LoadTimeWeaving-demo