AOP案例:测量业务层接口万次执行时间

1. 准备

需求:任意业务层接口执行均可显示执行的时长;

切入点配置: 所有业务层的方法都要绑定通知方法,所以用 接口.*
通知绑定类型:由于要原始方法的前后都要有增强,所以使用 @Around环绕

1.1 service层:

接口类:
在这里插入图片描述

实现类
实现类的方法都注入了dao层的bean;
在这里插入图片描述

1.2 dao层:

使用注解开发
在这里插入图片描述

1.3 SpringConfig配置类:

配置了jdbc.properties配置文件;
且已经整合了MyBatis:
在这里插入图片描述
jdbcConfig提供dataSource的bean
在这里插入图片描述
MyBatisConfig:
需要建立sqlSession和扫描mapper的两个bean;
Speing整合MyBatis的方法
在这里插入图片描述

2. AOP

定义:AOP即面向切面编程,是一种编程范式,知道开发者如何组织程序结构;

作用:在【不改变原始设计的基础上】 为其进行功能增强;
Spring理念:无侵入式编程;

思路分析
准备: ①导入AOP和Aspect的坐标 ②准备连接点(BookDaoImpl的原始方法)

  1. 制作共性功能------通知通知类
  2. 在通知类中定义 切入点 Pointcut
  3. 绑定通知方法和切入点(切面

2.1 导坐标

aop包默认依赖于spring-context;

在这里插入图片描述

2.2 在通知类中定义通知和切入点,并绑定

  • 在SpringConfig配置文件开启AOP驱动注释@EnableAspectJAuotoProxy ,让Spring去扫描@Aspect;在这里插入图片描述

  • 新建一个aop层和 ProjectAdvice通知类
    在通知类中注解@Component定义bean;
    注解@Aspect表明这是AOP

  • 注释 @PointCut 配置切入点空壳+切入点描述
    切入点描述:要监控所有的方法,则可能有返回值用 *, 监控的是所有service的任意方法,任意参数所以用 包名.*Serivce. *(…)
    在这里插入图片描述

  • 定义通知方法、绑定(5中绑定方式)
    通知方法为runSpeed,在方法内写增强功能的代码逻辑;
    使用了@Around环绕的方式绑定,需要ProceedingJoinPoint 作为通知方法的参数
    环绕控制返回值类型为Object,但是此处不需要可以为void;
    使用ProceedingJoinPoint对象的 proceed() 来调用原始方法;
    如果需要原始方法的查询结果,则要让接口方法的返回值为Object,由 pjp.preceed 获取返回值,并在最后return;
    执行一万次原始方法,然后打印时间差;
    在这里插入图片描述

2.3 测试类:

在这里插入图片描述

运行整个测试类的结果:
在这里插入图片描述

3. 问题及改进

问题:无法区分结果属于哪个方法;

改进
需要获取执行的是哪个方法,而ProceedingJoinPoint 描述了原来方法的执行对象;
ProceedingJoinPoint 对象 .getSignature() 可以获取 签名信息 signature
signature. getDeclaringTypeName() 获取原始方法的类型;
signature. getName 获取原始方法名;

在这里插入图片描述

再次打印:此时可区分方法属于的类和方法名;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring AOP中,拦截器责任链处理过程是指当目标方法被多个通知匹配到时,Spring通过引入拦截器链来保证每个通知的正常执行。拦截器链是由一系列的拦截器组成的,每个拦截器都负责在目标方法的前后执行特定的逻辑。 在源码中,拦截器责任链的处理过程主要通过MethodInvocation接口来实现。MethodInvocation接口提供了proceed()方法,用于执行拦截器链中下一个拦截器的逻辑。当调用proceed()方法时,会按照拦截器链的顺序依次执行每个拦截器的逻辑,直到达到链的末尾或者某个拦截器决定终止链的执行。 在拦截器责任链处理过程中,每个拦截器可以在目标方法的调用前后执行自定义的逻辑。拦截器可以对方法的参数进行检查、修改方法的返回值,或者在方法执行前后记录日志等操作。通过拦截器责任链的处理,Spring AOP能够实现面向切面编程的功能。 需要注意的是,拦截器链的执行顺序是根据拦截器的配置顺序确定的。在Spring的配置文件中,可以通过配置拦截器的顺序来控制拦截器链的执行顺序。这样可以确保每个拦截器按照预期的顺序执行,从而达到期望的功能效果。 总结起来,Spring AOP源码的拦截器责任链处理过程主要通过MethodInvocation接口实现,它通过调用proceed()方法来依次执行拦截器链中每个拦截器的逻辑。拦截器链的执行顺序可以通过配置文件来控制,从而实现面向切面编程的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Spring AOP源码:拦截器责任链处理过程](https://blog.csdn.net/weixin_45031612/article/details/128806966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Spring AOP 自动代理源码 DefaultAdvisorAutoProxyCreator](https://download.csdn.net/download/weixin_38530536/14854229)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【SpringSpring AOP 源码分析-拦截器链的执行过程(四)](https://blog.csdn.net/qq_46514118/article/details/121912507)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值