AOP是面向切面编程( Aspect)
简单的说就是把我们重复的代码抽取出来,在需要执行的时候,使用动态代理技术,在不修改源码的基础上,对我们已有的方法进行增强
AOP的作用和优势
作用:在程序运行期间,不修改源码对已有方法进行增强。
优势:减少重复代码,提高开发效率,维护方便
AOP的实现方式:使用动态代理技术
事务
MySQL、数据库里都提供一个事务机制,我们如果开启一个事务,在这个事务里执行多条增删改的sql语句,这个过程中,如果任何一个sql语句失败了,会导致这个事务的回滚,把其他sql做的数据更改都回复回去。
在一个事务中的所有sql,要么一起成功,要么一起失败。事务功能可以保证我们的数据的一致性,在业务逻辑里加入这个事务
思考:
几十个地方需要写重复性的代码,比如:创建事务、回滚或提交事务的代码,可以使用springAOP机制
MyServiceXXXX的这种类,在这些类的所有方法中,都去织入一些代码,在所有这些方法刚开始运行的时候,都先去开启一个事务,在所有这些方法运行完毕之后,去根据是否抛出异常来判断一下,如果抛出异常,就回滚事务,如果没有异常,就提交事务 => AOP
AOP的核心技术是动态代理,会对你的那些类生成动态代理
动态代理:
比如说有个MyServiceA的类,spring会动态生成一个ProxyMyServiceA的动态代理类,会将MyServiceA注入进去。
当Controller注入MyServiceA的时候,spring会将动态代理类ProxyMyServiceA的对象注入,会直接调用ProxyMyServiceA代理类中的方法。
【评论区】
1、他人总结
aop:面向切面,通过动态代理的方式来生成其代理对象在方法执行前后加入自己的逻辑
代理方式
jdk动态代理(接口)
cglib动态代理(基于类)
相关名词:
(1) JoinPoint连接点:拦截的接口的方法
(2) Pointcut切入点:对哪些连接点进行拦截
(3)Advice通知:比如前置通知 后置通知 环绕通知
(4) aspect切面:切入点和通知组成 - 切入点 execution表达式 1. execution 权限修饰符 返回值类型 包名.类名.方法名(参数) -
通知类型
(1)前置通知:方法执行之前
(2)后置通知:在方法正常执行完毕后(提交事务)
(3)最终通知:在方法正常执行完毕或者出现异常
(4)异常通知:执行过程中出现异常(事物回滚)
(5)环绕通知:方法执行前后,目标方法默认不执行需自己调用方法
2、今天去面试问了我一个问题:网关灰度发布的时候,app->网关->api服务->dubbo服务,网关是可以灰度选择API服务,如果是dubbo服务呢,如何进行灰度?
您看我这样回答可对,API服务里指定新版本的dubbo服务,灰度请求到指定的API服务后,该服务里本身指定了dubbo接口的新版本,所以能够选中灰度的这台dubbo服务。
没啥问题,dubbo灰度建议通过group去区分dubbo的调用因为版本号的变化让业务人员认为这是对上一个版本的迭代语义上是有歧义的;然后dubbo服务灰度的同时上次调用的api其实也是灰度的因为代码不一样了,也需要通过网关来配置api灰度的权重
3、spring ioc注入的时候,代理对象和被代理对象是怎么选择的?
4、为什么spring aop 要基于接口实现动态代理呢?
AOP使用JDK动态代理的话是需要基于接口的,通过反射去构造代理对象的时候,一个必要参数就是接口类型,因为需要代理类与被代理类有相同的目标方法