网站如何发布到网上,怎样做企业官方网站,旅游网站国内外研究现状,021新手学做网站2.1 AOP概述
什么是AOP#xff1f; AOP英文全称#xff1a;Aspect Oriented Programming#xff08;面向切面编程、面向方面编程#xff09;#xff0c;其实说白了#xff0c;面向切面编程就是面向特定方法编程。 那什么又是面向方法编程呢#xff0c;为什么又需要面向…2.1 AOP概述
什么是AOP AOP英文全称Aspect Oriented Programming面向切面编程、面向方面编程其实说白了面向切面编程就是面向特定方法编程。 那什么又是面向方法编程呢为什么又需要面向方法编程呢来我们举个例子做一个说明
比如我们这里有一个项目项目中开发了很多的业务功能。 然而有一些业务功能执行效率比较低执行耗时较长我们需要针对于这些业务方法进行优化。 那首先第一步就需要定位出执行耗时比较长的业务方法再针对于业务方法再来进行优化。
此时我们就需要统计当前这个项目当中每一个业务方法的执行耗时。那么统计每一个业务方法的执行耗时该怎么实现
可能多数人首先想到的就是在每一个业务方法运行之前记录这个方法运行的开始时间。在这个方法运行完毕之后再来记录这个方法运行的结束时间。拿结束时间减去开始时间不就是这个方法的执行耗时吗 以上分析的实现方式是可以解决需求问题的。但是对于一个项目来讲里面会包含很多的业务模块每个业务模块又包含很多增删改查的方法如果我们要在每一个模块下的业务方法中添加记录开始时间、结束时间、计算执行耗时的代码就会让程序员的工作变得非常繁琐。 而AOP面向方法编程就可以做到在不改动这些原始方法的基础上针对特定的方法进行功能的增强。 AOP的作用在程序运行期间在不修改源代码的基础上对已有方法进行增强无侵入性: 解耦 我们要想完成统计各个业务方法执行耗时的需求我们只需要定义一个模板方法将记录方法执行耗时这一部分公共的逻辑代码定义在模板方法当中在这个方法开始运行之前来记录这个方法运行的开始时间在方法结束运行的时候再来记录方法运行的结束时间中间就来运行原始的业务方法。 而中间运行的原始业务方法可能是其中的一个业务方法比如我们只想通过 部门管理的 list 方法的执行耗时那就只有这一个方法是原始业务方法。 而如果我们是先想统计所有部门管理的业务方法执行耗时那此时所有的部门管理的业务方法都是 原始业务方法。 那面向这样的指定的一个或多个方法进行编程我们就称之为 面向切面编程。 那此时当我们再调用部门管理的 list 业务方法时啊并不会直接执行 list 方法的逻辑而是会执行我们所定义的 模板方法 然后再模板方法中 记录方法运行开始时间 运行原始的业务方法那此时原始的业务方法就是 list 方法 记录方法运行结束时间计算方法执行耗时
不论我们运行的是那个业务方法最后其实运行的就是我们定义的模板方法而在模板方法中就完成了原始方法执行耗时的统计操作 。(那这样呢我们就通过一个模板方法就完成了指定的一个或多个业务方法执行耗时的统计) 而大家会发现这个流程我们是不是似曾相识啊
对了就是和我们之前所学习的动态代理技术是非常类似的。 我们所说的模板方法其实就是代理对象中所定义的方法那代理对象中的方法以及根据对应的业务需要 完成了对应的业务功能当运行原始业务方法时就会运行代理对象中的方法从而实现统计业务方法执行耗时的操作。
其实AOP面向切面编程和OOP面向对象编程一样它们都仅仅是一种编程思想而动态代理技术是这种思想最主流的实现方式。而Spring的AOP是Spring框架的高级技术旨在管理bean对象的过程中底层使用动态代理机制对特定的方法进行编程(功能增强)。 AOP的优势 减少重复代码 提高开发效率 维护方便 2.2 AOP快速入门
在了解了什么是AOP后我们下面通过一个快速入门程序体验下AOP的开发并掌握Spring中AOP的开发步骤。
需求统计各个业务层方法执行耗时。
实现步骤 导入依赖在pom.xml中导入AOP的依赖 编写AOP程序针对于特定方法根据业务需要进行编程 为演示方便可以自建新项目或导入提供的springboot-aop-quickstart项目工程 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;}
} 重新启动SpringBoot服务测试程序 查询3号部门信息 我们可以再测试下查询所有部门信息同样执行AOP程序 我们通过AOP入门程序完成了业务方法执行耗时的统计那其实AOP的功能远不止于此常见的应用场景如下 记录系统的操作日志 权限控制 事务管理我们前面所讲解的Spring事务管理底层其实也是通过AOP来实现的只要添加Transactional注解之后AOP程序自动会在原始方法运行前先来开启事务在原始方法运行完毕之后提交或回滚事务
这些都是AOP应用的典型场景。 通过入门程序我们也应该感受到了AOP面向切面编程的一些优势 代码无侵入没有修改原始的业务方法就已经对原始的业务方法进行了功能的增强或者是功能的改变 减少了重复代码 提高开发效率 维护方便