浅谈Spring AOP
什么是AOP,AOP有什么用
AOP的意思就是把用户自定义的操作“切”到很多方法里面。
就像这样…
看起来一个很好的应用就是日志,因为我们会想在很多地方插入日志。AOP和之前,比如说,logback的区别在哪呢?
logback像是在每个地方插入日志处理:
但是这是一个侵入式的操作。也就是说,每个方法里都得自己写入日志逻辑。比如说现在我不想要日志了,就得从每个方法里把调用给删掉,挺烦的。
而AOP的解决方案是非侵入式的:
主程序流并不知道我们偷偷加入了自己的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的实现方式是:
- 使用一个List储存所有绑定目标的advice。
- 维护一个idx指针,指向当前要执行的advice。
- 依次执行(idx自增)。
PS: 与阿里RPC框架HSF中的Interceptor机制一模一样。