什么是 AOP
AOP (aspect-oriented programming ),面向切面编程,是编程范式的一种;
旨在通过允许跨领域关注点的分离来提高模块化,通过在不修改代码本身的情况下向现有代码添加其他行为(建议)来实现的,通过“切入点”规范分别指定要修改的代码,例如“在函数名称以’set’开头时记录所有函数调用””。这允许将对业务逻辑不是很重要的行为(例如日志记录)添加到程序中,而不会使功能的核心代码混乱。
– https://en.wikipedia.org/wiki/Aspect-oriented_programming
Java 世界中 AOP 的几种实现方式
- 使用
代理
实现 - 使用 AspectJ 框架,通过代码织入实现
java 中的代理
- 静态代理
此处省略一些字。。。
- 动态代理
- Java Proxy (仅支持接口)
基于 java 原生的技术编辑字节码,创建动态代理
- CGlib(支持非 final 类)
基于 ASM 框架的字节码增强技术实现动态创建类,并基于 ClassLoader 装载
Spring AOP 的底层实现
Springaop 默认使用标准 JDK 动态代理
作为 AOP 代理。 使得任何接口
都可以被代理。
Springaop 也可以使用 CGLIB 代理
, 默认情况下,如果业务对象没有实现接口
,则使用 CGLIB。
由于对接口而不是类进行编程是一种良好的做法,业务类通常实现一个或多个业务接口。 强制使用 CGLIB 是可能的
,在那些(希望是极少的)情况下,您需要建议一个未在接口上声明的方法,或者您需要将代理对象作为具体类型传递给方法。
掌握 springaop 是基于代理的这一事实非常重要。 请参阅了解 AOP 代理来彻底检查这个实现细节到底意味着什么。
– 5.3 https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-introduction-proxies
Spring AOP 与 AspectJ 的关系
Springaop 是用纯 Java
实现的。 不需要特殊的编译过程。 Springaop 不需要控制类装入器层次结构,因此适合在 servlet 容器
或应用服务器
中使用。
Springaop 目前只支持方法执行连接点
。
Springaop 的 AOP 方法不同于大多数其他 AOP 框架。 我们的目标不是提供最完整的 AOP 实现
。 相反,其目的是提供 AOP 实现和 Spring IoC 之间的紧密集成,以帮助解决企业应用程序中的常见问题。
使用 springaop 无法轻松或高效地完成某些工作,比如建议非常细粒度的对象(通常是域对象)。 Aspectj
是这种情况下的最佳选择。
Springaop 从未努力与 AspectJ 竞争以提供全面的 AOP 解决方案
。 我们认为基于代理的框架(如 Spring AOP)和成熟的框架(如 AspectJ)都是有价值的,它们是互补的,而不是竞争的。 Spring 无缝集成了 springaop 和 IoC 与 AspectJ,以便在一致的基于 Spring 的应用程序体系结构中启用 AOP 的所有用途。
– 5.2 https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-introduction-spring-defn
Spring 仅是使用 AspectJ 提供的用于切入点解析和匹配
的库注解与 AspectJ 5相同的注解。 不过,AOP 运行时仍然是纯 Spring AOP,并且不依赖于 AspectJ compiler 或 weaver
。
– 5.4 https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop-ataspectj
https://blog.mythsman.com/post/5d301cf2976abc05b34546be/