AOP,即面向切面编程是很常用的技术,特别是在Java Web开发中。而最流行的AOP框架分别是Spring AOP和AspectJ。
Spring AOP是基于Spring IoC实现的,它解决大部分常见的需求,但它并不是一个完整的AOP解决方案。对于非Spring容器管理的对象,它更没有办法了。而AspectJ旨在提供完整的AOP方案,因此也会更复杂。
两者织入方式有极大的不同,这也是它们的本质区别,它们实现代理的方式不同。
AspectJ是在运行前织入的,分为三类:
- 编译时织入
- 编译后织入
- 加载时织入
因此需要AspectJ编译器(ajc)的支持。
而Spring AOP是运行时织入的,主要使用了两种技术:JDK动态代理和CGLIB代理。对于接口使用JDK Proxy,而继承的使用CGLIB。

因为织入方式的区别,两者所支持的Joinpoint也是不同的。像final的方法和静态方法,无法通过动态代理来改变,所以Spring AOP无法支持。但AspectJ是直接在运行前织入实际的代码,所以功能会强大很多。
编译织入会比较运行时织入快很多,Spring AOP是使用代理模式在运行时才创建对应的代理类,效率没有AspectJ高。
因为AspectJ比较强大,在项目中应用会更多,所以这里只介绍它与Spring Boot的集成。
引入以下依赖,在Spring Boot基础上加了Lombok和aspectj:
为了验证AOP的功能,我们添加一个TestController,它有一个处理Get请求的方法,同时会调用private的成员方法和静态方法:
配置切面如下:
定义哪些类和方法会被捕抓来代理,这里配置的是controller下的所有方法。
而和则定义了一些处理逻辑。是打印了方法名,而是做了一个计时。
注意:是不需要配置的。
因为是需要编译时织入代码,所以需要maven插件的支持:github.com/mojohaus/as…
配置好pom.xml文件即可。
然后执行命令打包:
这时会显示一些织入信息,大致如下:
看到以上信息,说明成功织入了代码,具体可以查看生成的class文件。

可以看到有许多代码都不是我们写的,而是织入生成。
编译成功后,我们就执行代码。如果是通过IDEA来执行,则在运行前不需要再build了,因为已经通过maven build过了包。通过IDEA自带的编译器build,可能无法织入。或者选择ajc作为编译器。具体请参考:IDEA启动Springboot但AOP失效
访问如下:
则日志如下,成功实现AOP功能:

遇到错误:
需要配置插件:
可能还会遇到无法识别Lombok的错误,配置如下则解决该问题:
AOP场景应用特别多,还是需要掌握的。
代码请看GitHub: github.com/LarryDpk/pk…
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/10564.html