springboot#aop
先说动态代理,动态代理对一个类所有方法调用进行拦截,蛋实际上,我们需要对某个特定方法进行拦截。所以实际使用过程中,需要对被拦截到的方法进行判断,看是否为真正需要被拦截的方法。这就麻烦啦,也不灵活。
再说说aop可以对具体方法(或者满足条件的一些方法)进行拦截了,通过切点(pointcut)定义需要被拦截的方法。
然后通过增强(advice),完成对被拦截方法的功能扩充。
增强(advice) + 切点(pointcut) 就构成了一个切面(advisor),切面类通过@Aspect注解进行标注。
最后再说说一些相关概念:
对方法进行增强,叫做 Weaving,织入
对类进行增强,叫做Introduction,引入
一点补充:
切点不一定切的是方法,常见的还有切注解的,通过切一个注解,实现一些特殊的功能。
最后的吐槽:
垃圾如我,总是搞不清动态代理和aop,谈动态代理,可以先想想代理是啥,就是对一个东西进行代理,比如代理一个区域的某药品经销,这时候就可以提提价,强买强卖啊,在代码中也是这样的,代理对象除了完成基本的功能,通常提供也写额外的功能,可以说代理是一种增强。而aop,面向切面编程本质上也是一整增强,只是更灵活了。而且基于方法拦截的动态代理在aop面前就显的有点僵硬或者说是武断(因为拦截的是每一个方法调用,不知是武断,还是不灵活)。