Skip to content

Latest commit

 

History

History
 
 

本示例主要演示通过多种方式实现AOP

方法一:通过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