方法一:通过aspectj-maven-plugin插件在编译期进行织入
本示例利用别人重新封装的插件,而非Codehaus的官方提供的插件,Codehaus的官方提供的插件 只能支持JDK8(包含JDK8)以下的版本,而本示例的插件可以支持到JDK13
本示例的插件github地址:https://github.com/nickwongdev/aspectj-maven-plugin
Codehaus的官方插件地址:https://github.com/mojohaus/aspectj-maven-plugin 以及相应介绍:https://www.mojohaus.org/aspectj-maven-plugin/index.html
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
<plugin>
<groupId>com.nickwongdev</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.12.6</version>
<configuration>
<complianceLevel>${java.version}</complianceLevel>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.encoding}</encoding>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.5</version>
</dependency>
</dependencies>
通过执行maven命令 mvn clean compile
方法二:利用aspectjweaver在JVM进行类加载时进行织入
步骤一:
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.5</version>
</dependency>
步骤二:创建切面类和需要被织入的目标类
具体看代码
步骤三:在src/main/resource目录下创建META-INF/aop.xml文件
<aspectj>
<weaver options="-XnoInline -Xset:weaveJavaxPackages=true -Xlint:ignore -verbose -XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
<!--在编织时导入切面类和需要被切入的目标类-->
<include within="com.github.lybgeek.aop.aspect.EchoAspect"/>
<include within="com.github.lybgeek.aop.service.EchoService"/>
</weaver>
<aspects>
<!--指定切面类-->
<aspect name="com.github.lybgeek.aop.aspect.EchoAspect"/>
</aspects>
</aspectj>
步骤四:指定VM参数
-javaagent:aspectjweaver.jar的路径
示例:
-javaagent:D:\repository\org\aspectj\aspectjweaver\1.9.5\aspectjweaver-1.9.5.jar
或者也可以直接和spring-boot-maven-plugin插件整合,agent这个配置参数需要在spring 2.2.0+版本才有
示例:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.0.RELEASE</version>
<configuration>
<agents>
<agent>
${settings.localRepository}/org/aspectj/aspectjweaver/1.9.5/aspectjweaver-1.9.5.jar
</agent>
</agents>
</configuration>
</plugin>
</plugins>
</build>
方法三:利用spring aop在运行时织入
这个烂大街了,省略
方法四:利用spring aop提供的原生API实现
原生的API有:AspectJProxyFactory、ProxyFactoryBean、ProxyFactory 例子查看测试类:com.github.lybgeek.aop.test.AopApiTest
方法五:利用APT + JavaPoet 在编译期实现切面逻辑(该方法只能生成java文件无法对原有java文件进行修改)
JavaPoet是JavaPoet 是生成 .java 源文件的 Java API,具体查看官方文档 https://github.com/square/javapoet 或者查看此博文https://weilu.blog.csdn.net/article/details/112429217
方法六:利用APT + AST 在编译器实现切面逻辑(利用AST语法树,可以在编译器对原有的java文件进行修改)
AST相关资料:
https://z.itpub.net/article/detail/8DC0190A2BDA5BC5EB8696A7A651779E https://blog.csdn.net/u013998373/article/details/90050810 https://blog.csdn.net/a_zhenzhen/article/details/86065063