广东省高校质量工程建设网站,外贸论坛买家信息网,专业机票网站建设,wordpress 小云app目录 1AOP基础
1.1 AOP概述
1.2AOP快速使用
2.3 AOP核心概念 1AOP基础
首先介绍一下什么是AOP#xff0c;再通过一个快速入门程序#xff0c;让大家快速体验AOP程序的开发。最后再介绍AOP当中所涉及到的一些核心的概念。
1.1 AOP概述
什么是AOP#xff1f;
说白了再通过一个快速入门程序让大家快速体验AOP程序的开发。最后再介绍AOP当中所涉及到的一些核心的概念。
1.1 AOP概述
什么是AOP
说白了面向切面编程就是面向特定方法编程。
那什么又是面向方法编程呢为什么又需要面向方法编程呢来我们举个例子做一个说明
比如我们这里有一个项目项目中开发了很多的业务功能 然而有一些业务功能执行效率比较低执行耗时较长我们需要针对于这些业务方法进行优化。 那首先第一步就需要定位出执行耗时比较长的业务方法再针对于业务方法再来进行优化。
此时我们就需要统计当前这个项目当中每一个业务方法的执行耗时。那么统计每一个业务方法的执行耗时该怎么实现
可能多数人首先想到的就是在每一个业务方法运行之前记录这个方法运行的开始时间。在这个方法运行完毕之后再来记录这个方法运行的结束时间。拿结束时间减去开始时间不就是这个方法的执行耗时吗 以上分析的实现方式是可以解决需求问题的。但是对于一个项目来讲里面会包含很多的业务模块每个业务模块又包含很多增删改查的方法如果我们要在每一个模块下的业务方法中添加记录开始时间、结束时间、计算执行耗时的代码就会让程序员的工作变得非常繁琐。
而AOP面向方法编程就可以做到在不改动这些原始方法的基础上针对特定的方法进行功能的增强。 AOP的作用在程序运行期间在不修改源代码的基础上对已有方法进行增强无侵入性: 解耦 要想完成统计各个业务方法执行耗时的需求只需要定义一个模板方法将记录方法执行耗时这一部分公共的逻辑代码定义在模板方法当中在这个方法开始运行之前来记录这个方法运行的开始时间在方法结束运行的时候再来记录方法运行的结束时间中间就来运行原始的业务方法。 而中间运行的原始业务方法可能是其中的一个业务方法比如我们只想通过 部门管理的 list 方法的执行耗时那就只有这一个方法是原始业务方法。 而如果我们是先想统计所有部门管理的业务方法执行耗时那此时所有的部门管理的业务方法都是 原始业务方法。 那面向这样的指定的一个或多个方法进行编程我们就称之为 面向切面编程。 那此时当再调用部门管理的 list 业务方法时啊并不会直接执行 list 方法的逻辑而是会执行我们所定义的 模板方法 然后再模板方法中 记录方法运行开始时间 运行原始的业务方法那此时原始的业务方法就是 list 方法 记录方法运行结束时间计算方法执行耗时 不论我们运行的是那个业务方法最后其实运行的就是我们定义的模板方法而在模板方法中就完成了原始方法执行耗时的统计操作 。(那这样呢我们就通过一个模板方法就完成了指定的一个或多个业务方法执行耗时的统计) 书上所说的模板方法其实就是代理对象中所定义的方法那代理对象中的方法以及根据对应的业务需要 完成了对应的业务功能当运行原始业务方法时就会运行代理对象中的方法从而实现统计业务方法执行耗时的操作。
其实AOP面向切面编程和OOP面向对象编程一样它们都仅仅是一种编程思想而动态代理技术是这种思想最主流的实现方式。而Spring的AOP是Spring框架的高级技术旨在管理bean对象的过程中底层使用动态代理机制对特定的方法进行编程(功能增强)。 AOP的优势 减少重复代码 提高开发效率 维护方便 1.2AOP快速使用 导入依赖在pom.xml中导入AOP的依赖 编写AOP程序针对于特定方法根据业务需要进行编程
pom.xml
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId
/dependency
AOP程序TimeAspect
Component
Aspect //当前类为切面类
Slf4j
public class TimeAspect {Around(execution(* com.itheima.service.*.*(..))) public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {//记录方法执行开始时间long begin System.currentTimeMillis();//执行原始方法Object result pjp.proceed();//记录方法执行结束时间long end System.currentTimeMillis();//计算方法执行耗时log.info(pjp.getSignature()执行耗时: {}毫秒,end-begin);return result;}
}
AOP的功能常见的应用场景如下 记录系统的操作日志 权限控制 事务管理我们前面所讲解的Spring事务管理底层其实也是通过AOP来实现的只要添加Transactional注解之后AOP程序自动会在原始方法运行前先来开启事务在原始方法运行完毕之后提交或回滚事务
这些都是AOP应用的典型场景。
AOP面向切面编程的一些优势 代码无侵入没有修改原始的业务方法就已经对原始的业务方法进行了功能的增强或者是功能的改变 减少了重复代码 提高开发效率 维护方便 2.3 AOP核心概念
1. 连接点JoinPoint可以被AOP控制的方法暗含方法执行时的相关信息
连接点指的是可以被aop控制的方法。例如入门程序当中所有的业务方法都是可以被aop控制的方法。
1.4 通知Advice指哪些重复的逻辑也就是共性功能最终体现为一个方法
先记录这个方法运行的开始时间在每一个业务方法运行结束的时候再来记录这个方法运行的结束时间。
但是在AOP面向切面编程当中我们只需要将这部分重复的代码逻辑抽取出来单独定义。抽取出来的这一部分重复的逻辑也就是共性的功能。 3. 切入点PointCut匹配连接点的条件通知仅会在切入点方法执行时被应用
切入点pointcut概念。切入点指的是匹配连接点的条件。通知仅会在切入点方法运行时才会被应用。
在aop的开发当中我们通常会通过一个切入点表达式来描述切入点。 假如切入点表达式改为DeptServiceImpl.list()此时就代表仅仅只有list这一个方法是切入点。只有list()方法在运行的时候才会应用通知。
4. 切面Aspect描述通知与切入点的对应关系通知切入点
当通知和切入点结合在一起就形成了一个切面。通过切面就能够描述当前aop程序需要针对于哪个原始方法在什么时候执行什么样的操作。
切面所在的类我们一般称为切面类被Aspect注解标识的类
5. 目标对象Target通知所应用的对象
目标对象指的就是通知所应用的对象我们就称之为目标对象。
Spring的AOP底层是基于动态代理技术来实现的也就是说在程序运行的时候会自动的基于动态代理技术为目标对象生成一个对应的代理对象。在代理对象当中就会对目标对象当中的原始方法进行功能的增强