Spring AOP 原理篇

以前在 Spring AOP 应用篇,讲述了 AOP 的使用,这一篇来说一些 Spring AOP的实现原理。java

Spring 主要经过两种技术来实现 AOP,Java 动态代理CGLib 动态代理设计模式

Java 动态代理

因为知识点比较多,单独写来一篇文章,参考 设计模式之动态代理框架

CGLib 动态代理

参考 CGLib 动态代理工具

Spring AOP 的选择策略

既然有两种技术能够实现,那么实际运用时,到底选择的是哪种呢?post

默认的选择策略是性能

  • 若是目标类实现了接口,则选择 java动态代理技术
  • 若是目标类没有实现了接口,则选择CGLib 动态代理,前提是目标类没有被 final 修饰

多个 AOP 做用到同一个目标类时的执行顺序

实际应用中常常遇到这样的状况,那么这多个AOP的执行顺序是怎么样的呢,答案是链式调用设计

番外

Aspectj

在使用 Spring AOP 的过程当中,咱们常常用的 Aspectj的注解。好比 @Aspect、@Pointcut、@Before、@After等代理

哪一个这个 Aspectj 是什么呢接口

Aspectj 也是一个 AOP 框架,与 Spring AOP不一样的是,它不是经过动态代理实现的。而是在编译时,就把代理方法植入到目标方法中get

  • 因为是静态织入的,因此性能相对来讲比较好
  • 因为是静态织因此也不受类的限制,无论是private、或者static、或者final的,无论有没有接口均可以代理
  • Aspectj不会代理除了限定方法以外任何其余诸如toString()等方法

Spring AOP 与 Aspectj 的关系

Spring AOP 虽然引用了Aspectj的一些核心概念,好比Aspect、advice、joinpoint等,也使用了AspectJ中的一些注解。好比@pointCut、@after、@before等。

但Spring AOP 并非 Aspectj,它不会向 Aspectj同样,在编译时,就把代理方法植入到目标方法中。它只是用了一些 Aspectj的工具,并对java动态代理和CGLIB代理作了一层封装,因此实际上Spring AOP和Aspectj的关系并不大

相关文章
相关标签/搜索