代码地址:https://github.com/hellboy0621/aop-agent-demo.git
创建一个SpringBoot 项目
引入相关依赖
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
被增强类
@Service
public class MyService {
private static final Logger LOGGER = LoggerFactory.getLogger(MyService.class);
final public void foo() {
LOGGER.info("foo()");
bar();
}
public void bar() {
LOGGER.info("bar()");
}
}
切面
@Aspect
public class MyAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(MyAspect.class);
@Before("execution(* com.xtransformers.service.MyService.*())")
public void before() {
LOGGER.info("before()");
}
}
主类
@SpringBootApplication
public class AopAgentDemoApplication {
private static final Logger LOGGER = LoggerFactory.getLogger(AopAgentDemoApplication.class);
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(AopAgentDemoApplication.class, args);
MyService myService = context.getBean(MyService.class);
LOGGER.info("MyService: {}", myService.getClass());
myService.foo();
context.close();
}
}
配置 aop.xml 文件(路径:resources/META-INF/aop.xml)
<aspectj>
<aspects>
<aspect name="com.xtransformers.aop.MyAspect"/>
<weaver options="-verbose -showWeaveInfo">
<include within="com.xtransformers.service.MyService"/>
<include within="com.xtransformers.aop.MyAspect"/>
</weaver>
</aspects>
</aspectj>
在 VM options 里增加 javaagent
# 需要把Maven Repo路径(/Users/daniel/java/maven/repository)修改为自己的仓库路径
-javaagent:/Users/daniel/java/maven/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar
运行日志:
/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home/bin/java -javaagent:/Users/daniel/java/maven/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar -XX:TieredStopAtLevel=1 -noverify -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:/Users/daniel/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/213.7172.25/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=53033:/Users/daniel/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/213.7172.25/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/daniel/Documents/code/aop-agent-demo/target/classes:/Users/daniel/java/maven/repository/org/springframework/boot/spring-boot-starter/2.6.6/spring-boot-starter-2.6.6.jar:/Users/daniel/java/maven/repository/org/springframework/boot/spring-boot/2.6.6/spring-boot-2.6.6.jar:/Users/daniel/java/maven/repository/org/springframework/spring-context/5.3.18/spring-context-5.3.18.jar:/Users/daniel/java/maven/repository/org/springframework/spring-aop/5.3.18/spring-aop-5.3.18.jar:/Users/daniel/java/maven/repository/org/springframework/spring-beans/5.3.18/spring-beans-5.3.18.jar:/Users/daniel/java/maven/repository/org/springframework/spring-expression/5.3.18/spring-expression-5.3.18.jar:/Users/daniel/java/maven/repository/org/springframework/boot/spring-boot-autoconfigure/2.6.6/spring-boot-autoconfigure-2.6.6.jar:/Users/daniel/java/maven/repository/org/springframework/boot/spring-boot-starter-logging/2.6.6/spring-boot-starter-logging-2.6.6.jar:/Users/daniel/java/maven/repository/ch/qos/logback/logback-classic/1.2.11/logback-classic-1.2.11.jar:/Users/daniel/java/maven/repository/ch/qos/logback/logback-core/1.2.11/logback-core-1.2.11.jar:/Users/daniel/java/maven/repository/org/apache/logging/log4j/log4j-to-slf4j/2.17.2/log4j-to-slf4j-2.17.2.jar:/Users/daniel/java/maven/repository/org/apache/logging/log4j/log4j-api/2.17.2/log4j-api-2.17.2.jar:/Users/daniel/java/maven/repository/org/slf4j/jul-to-slf4j/1.7.36/jul-to-slf4j-1.7.36.jar:/Users/daniel/java/maven/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar:/Users/daniel/java/maven/repository/org/springframework/spring-core/5.3.18/spring-core-5.3.18.jar:/Users/daniel/java/maven/repository/org/springframework/spring-jcl/5.3.18/spring-jcl-5.3.18.jar:/Users/daniel/java/maven/repository/org/yaml/snakeyaml/1.29/snakeyaml-1.29.jar:/Users/daniel/java/maven/repository/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar:/Users/daniel/java/maven/repository/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar:/Users/daniel/java/maven/repository/org/aspectj/aspectjrt/1.9.7/aspectjrt-1.9.7.jar com.xtransformers.AopAgentDemoApplication
Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none and -noverify were deprecated in JDK 13 and will likely be removed in a future release.
[AppClassLoader@251a69d7] info AspectJ Weaver Version 1.9.7 built on Thursday Jun 24, 2021 at 16:14:45 PDT
[AppClassLoader@251a69d7] info register classloader jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7
[AppClassLoader@251a69d7] info using configuration /Users/daniel/Documents/code/aop-agent-demo/target/classes/META-INF/aop.xml
[AppClassLoader@251a69d7] info register aspect com.xtransformers.aop.MyAspect
. ____ _ __ _ _
/\\\\ / ___'_ __ _ _(_)_ __ __ _ \\ \\ \\ \\
( ( )\\___ | '_ | '_| | '_ \\/ _` | \\ \\ \\ \\
\\\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.6)
[AppClassLoader@251a69d7] warning javax.* types are not being woven because the weaver option '-Xset:weaveJavaxPackages=true' has not been specified
2022-04-16 21:07:53.639 INFO 77340 --- [ main] c.xtransformers.AopAgentDemoApplication : Starting AopAgentDemoApplication using Java 17.0.1 on DanieldeMacBook-Pro.local with PID 77340 (/Users/daniel/Documents/code/aop-agent-demo/target/classes started by daniel in /Users/daniel/Documents/code/aop-agent-demo)
2022-04-16 21:07:53.642 INFO 77340 --- [ main] c.xtransformers.AopAgentDemoApplication : No active profile set, falling back to 1 default profile: "default"
[AppClassLoader@251a69d7] weaveinfo Join point 'method-execution(void com.xtransformers.service.MyService.foo())' in Type 'com.xtransformers.service.MyService' (MyService.java:17) advised by before advice from 'com.xtransformers.aop.MyAspect' (MyAspect.java)
[AppClassLoader@251a69d7] weaveinfo Join point 'method-execution(void com.xtransformers.service.MyService.bar())' in Type 'com.xtransformers.service.MyService' (MyService.java:22) advised by before advice from 'com.xtransformers.aop.MyAspect' (MyAspect.java)
2022-04-16 21:07:55.296 INFO 77340 --- [ main] c.xtransformers.AopAgentDemoApplication : Started AopAgentDemoApplication in 2.81 seconds (JVM running for 6.394)
2022-04-16 21:07:55.301 INFO 77340 --- [ main] c.xtransformers.AopAgentDemoApplication : MyService: class com.xtransformers.service.MyService
2022-04-16 21:07:55.310 INFO 77340 --- [ main] com.xtransformers.aop.MyAspect : before()
2022-04-16 21:07:55.310 INFO 77340 --- [ main] com.xtransformers.service.MyService : foo()
2022-04-16 21:07:55.310 INFO 77340 --- [ main] com.xtransformers.aop.MyAspect : before()
2022-04-16 21:07:55.310 INFO 77340 --- [ main] com.xtransformers.service.MyService : bar()
Process finished with exit code 0
可以看到 AspectJ 相关日志,并且前置通知都被执行了。