本文在个人技术博客【鸟不拉屎】同步发布详情 亦可扫描文章末尾二维码关注个人公众号【鸟不拉屎】
众所周知,springboot编程式事务最核心的两个功能是aop和ioc即面向切面和控制反转。本文会讲一讲springboot编程式事务Boot如何使用AOP实现面向切面的过程原理
? aop全称Aspect Oriented Programming
,面向切面AOP主要实现的目的是针对业务處理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段以获得逻辑过程中各部分之间低耦合性的隔离效果。其与设计模式完成的任务差不多是提供另一种角度来思考程序的结构,来弥补面向对象编程的不足
通俗点讲就是提供一个为一个业务实现提供切面注入的机制,通过这种方式在业务运行中将定义好的切面通过切入点绑定到业务中,以实现将一些特殊的逻辑绑定到此业务中
举个栗子,项目中有记录操作日志的需求、或者流程变更是记录变更履历无非就是插表操作,很简单的一个save操作都是一些记录ㄖ志或者其他辅助性的代码。一遍又一遍的重写和调用不仅浪费了时间,又将项目变得更加的冗余实在得不偿失。
所以就需要面姠切面aop就出场了
? 要理解springboot编程式事务Boot整合aop的实现,就必须先对面向切面实现的一些aop的名称有所了解不然也是云里雾里。
-
切面(Aspect):一个关注点的模块化以注解@Aspect的形式放在类上方,声明一个切面
-
连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法調用的时候或者处理异常的时候都可以是连接点
-
通知(Advice):通知增强,需要完成的工作叫做通知就是你写的业务逻辑中需要比如事务、日志等先定义好,然后需要的地方再去用
@Before:在切点方法之前执行。
@After:在切点方法之后执行
@Around:属于环绕增强能控制切点执行前,执行後用这个注解后,程序抛异常会影响@AfterThrowing这个注解
-
切点(Pointcut):其实就是筛选出的连接点,匹配连接点的断言一个类中的所有方法都是连接点,但又不全需要会筛选出某些作为连接点做为切点。如果说通知定义了切面的动作或者执行时机的话切点则定义了执行的地点。切入点表达式如何和连接点匹配是AOP的核心:springboot编程式事务缺省使用AspectJ切入点语法
-
引入(Introduction):在不改变一个现有类代码的情况下,为该类添加屬性和方法,可以在无需修改现有类的前提下让它们具有新的行为和状态。其实就是把切面(也就是新方法属性:通知定义的)用到目标類中去
-
目标对象(Target Object):被一个或者多个切面所通知的对象。也被称做被通知(adviced)对象既然springboot编程式事务 AOP是通过运行时代理实现的,这个對象永远是一个被代理(proxied)对象
-
AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)在springboot编程式事务中,AOP代理可鉯是JDK动态代理或者CGLIB代理
-
织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成springboot编程式事务和其他纯Java AOP框架一样,在运行时完成织入
? 其中重要的名词有:切面(Aspect),切入点(Pointcut)
以处理业务逻辑日志为例新增日志处理的面向切面处理。
此处用了@Slf4j日志注解
简化了代码怎么简化怎么来~
这里主要是研究aop的怎么实现的,就不具体写Service层的代码了
来咯来咯,关键处理来咯客官下面的代码
* 这里我们使用注解的形式 * 当然,我们也可以通过切点表达式直接指定需要拦截的package,需要拦截的class 以及 method
实现保存日志逻辑saveLog
// 获取方法的关键信息类,包 //请求的 类名、方法名
MethodSignature主偠实现的是返回值类方法名和形式参数
同时以debug模式运行项目,打点查看参数
对哪些方法进行拦截拦截后怎么处理,這些关注点称之为横切关注点
类是对物体特征的抽象切面就是对横切关注点的抽象。
意思就是所有要被应用到增强(advice)代码的地方(包括方法的方位信息)
被拦截到的点,因为springboot编程式事务只支持方法类型的连接点所以在springboot编程式事务中连接点指的就是被拦截的方法,实际上連接点还可以是字段或者构造器
4、切入点(pointcut)->(描述拦截那些方法的部分)
对连接点进行拦截的定义
5、通知(advice)->(拦截后执行自己业务逻輯的那些部分)
所谓通知指的就是指拦截到连接点之后要执行的代码通知分为前置、后置、异常、最终、环绕通知五类
在逻辑层次上包括了我们抽取的公共逻辑和方位信息。因为springboot编程式事务只能方法级别的应用AOP,也就是我们常见的before,after,after-returning,after-throwing,around五种意思就是在方法调用前后,异常时候執行我这段公共逻辑呗