一、简介
AOP 是一种思想,面向切面编程,而最流行的 AOP 实现框架分别为 Spring AOP 和 Aspect。
二、区别
Spring AOP 是基于 Spring Ioc 实现的,它解决了大部分常见的需求,但它并不是一个完整的 AOP 解决方案,对应非 Spring 管理的对象,它就没有办法了。而 Aspect 旨在提供完整的 AOP 方案,因此也会更复杂。
2.1 织入方式
两者织入方式有极大的不同,这也是它们的本质区别,它们实现代理的方式不同。
AspectJ 是在运行前织入的,分为三种情况:编译时织入、编译后织入、加载时织入。因此需要 AspectJ 编译器的支持。
而 Spring AOP 是运行时织入的,对于接口使用 JDK Proxy,而继承的使用 CGLIB
2.2 连接点
因为织入方式的区别,所以两者所支持的连接点也是不同的,像被 final 或者 static 修饰的方法就无法通过动态代理来改变,所以 Spring AOP 无法支持,但是 AspectJ 是直接在运行前织入实际的代码,所以功能会强大很多。
2.3 效率
编译织入会比较运行时织入快很多,Spring AOP 是使用代理模式在运行时才创建对应的代理类,效率没有 AspectJ 高。