less than 1 minute read

什么是AOP,AOP有什么用

AOP的意思就是把用户自定义的操作“切”到很多方法里面。

就像这样…

aop-concept

看起来一个很好的应用就是日志,因为我们会想在很多地方插入日志。AOP和之前,比如说,logback的区别在哪呢?

logback像是在每个地方插入日志处理:

logging1

但是这是一个侵入式的操作。也就是说,每个方法里都得自己写入日志逻辑。比如说现在我不想要日志了,就得从每个方法里把调用给删掉,挺烦的。

而AOP的解决方案是非侵入式的:

logging2

主程序流并不知道我们偷偷加入了自己的method。这就实现了很好的解耦。

AOP使用

“通知advice”就是我们自己定义的操作,“切点”就是在主程序的哪里执行通知。两者合起来就是”切面“。

advice有5种类型,分别是:

  • Before(前置通知) 目标方法调用之前执行
  • After(后置通知) 目标方法调用之后执行
  • After-returning(返回通知) 目标方法执行成功后执行
  • After-throwing(异常通知) 目标方法抛出异常后执行
  • Around(环绕通知) 相当于合并了前置和后置

切面使用例:

@Aspect
@Component
public class HelloAspect {

  @Before("execution(* com.test.service.impl.HelloServiceImpl.sayHello(..))")
  public void sayHello(){
    System.out.println("即将执行sayHello()...");
  }

}

这里使用了AspectJ。静态织入,比动态代理快多了。

注意:切面和被调用的类都要是bean(@Component)。

Spring AOP中的责任链模式

https://blog.csdn.net/zyb2017/article/details/79541227

https://www.jianshu.com/p/435f88db15cc

如果对一个目标有多个advice,那么就要一个个来。我们可以将这些advice变成一个链式结构,然后依次执行即可。

Spring AOP的实现方式是:

  1. 使用一个List储存所有绑定目标的advice。
  2. 维护一个idx指针,指向当前要执行的advice。
  3. 依次执行(idx自增)。

PS: 与阿里RPC框架HSF中的Interceptor机制一模一样。