aop的学习
AOP
事务
事务嘛,就是,用通俗易懂的语言说说,就是,有点同生共死的味道,比如说你一个接口里面,由好几个业务逻辑有机结合而成,那么就看业务需求是什么,比如说,你想删除某一个部门,那么就要在部门表里面删除该部门,接着在员工表里面删除该部门id的员工,比如说有其中一步出错了,比如,你把部门删了,员工还在,那么就寄了,所以就一定要让它们,要执行一起执行,一个环节出错全部都得停,那么这是第一种情况就要用require
接着就是,比如说,不管你接口成没成功,都要有一个方法写日志,这时候就是不能同生共死,那么就要创建一个新事务,那么就是requirenew,事务的底层逻辑就是AOP
AOP
AOP就是,用法就是,比如说,有好几个方法,都要实现一个相同的逻辑,要是把它们都写一遍,很麻烦,维护成本很高,所以就是要抽取出来,涉及到动态代理的思想,比如说,有一个经济人(接口),管着好几个明星(实现),有蔡徐坤,马嘉祺,糖果超甜,那么,要开演唱会的工作就由经纪人来完成,那么就有三步
- 布置场地
2.蔡徐坤唱歌,马嘉祺唱歌 - 收拾场地
1.布置场地
2.马嘉祺唱歌
3. 收拾场地
其中 1.3这两步都是一样的把,肯定不能让明星来做吧,那么就都抽取出来,让经纪人做,比如公司那边,对演唱会之前和之后要做的事情改动了,那么只要经纪人知道就行,也就很方便(就是抽取出来修改业务逻辑很方便)
现在讲讲Aop在spring中的使用
- 通知类型
- 通知顺序
- 切入点表达式
- 连接点
通知类型
通知,顾名思义就是一种,让所有人都听得到的一种方式,也就是接口里面的,要抽取出来的共同逻辑,而通知,也有好几种类型
- @Around
这种注解方式就是,写的通知,可以在目标方法的前后执行,可以在前后各写通知
那么如果我不需要两边都通知呢
- @@Before和@After
这就是,一个只能在前,一个只能在后
与After相似的还有@AfterReturning以及@AfterThrowing,可以说@Afetr是后两者的集大成者,@After是不管有没有异常都执行,而后两者的前者,无异常执行,后者,有异常才执行
通知顺序
通知顺序一般是按照,Aspect类的字母顺序来定义的,不同的注解是由区分的,比如说,@Before,前置通知,字母顺序越小,越先执行,@After,是后置通知,字母顺序越大,越先执行,但是呢,要是像这样来定义执行顺序的话,很麻烦,得去顾及执行顺序,不好命名,所以有其他方式
通过注解 @Order(2) //切面类的执行顺序(前置通知:数字越小先执行; 后置通知:数字越小越后执行)
切入点表达式
-
execution(……):这个注解就是,通过写清楚包地址的方式,定位到某一个实现类比如xxxservice,或者说定位到某一个通用接口就比如说updateXXX,就是如果能书写方便的情况下,定位到多个接口,那么是很好用的,也有许多语法规则可以省略定位的书写
-
@annotation只能说它是面向注解的注解,如果说上一个是面向类与方法的话,那么就要先讲讲自定义注解
自定义注解
编写的这个注解就是用来定位到要用的方法:其中@Target(ElementType.METHOD) 意思是面向方法,而@Retention(RetentionPolicy.RUNTIME) 意思是运行时有效
这个就是一个配置吧
如图所示,可以当做@MyLog和这个方法绑定好了
也可以和其他绑定,那为什么不一起呢,因为这样子方便绑定几个功能以及名字差别较大的方法,书写繁琐一点,但是灵活
接着就可以在切面类中,用@annotation定位到MYLog进而定位到其绑定的所有方法,当然也不要忘了,还可以自己封装一个切入点表达式(疯狂抽取思想啊啊啊!!!)
连接点
连接点有个要注意的点就是,around和其他注解的连接点不一样,书写方法不一样,但其实是一个道理,就是精确到接口
那连接点有什么用呢,就是想要拿到一些信息的时候,就可以通过连接点轻松锁定拿下,比如说要写日志,就可以从连接点中抽取信息出来,进行打印