点击上方关注“追梦 Java”↑,一起追梦!
上一篇文章详细介绍了静态代理和动态代理的作用和实现方式,并介绍了动态代理实现的两种方式。熟练掌握反射技术是一个程序员走向高级的必备技能,今天我们来了解一下如何用反射来实现自定义的 AOP 代码,结合配置文件的使用,完成一个反射高级应用的实例,大家感受一下反射的魅力。
为了学习的连贯性,强烈建议大家先阅读 代理设计模式与AOP 一文,然后再来阅读下面的内容。
1
如何统计方法执行的时间?
在日常开发中,我们经常会用到一个功能就是统计一个服务或者是一个方法的执行时间,也就是说在进入方法开始执行到方法执行完毕,总共耗费的时间是多少,用来评估一个方法的执行效率。
初级工程师 A 会说:“解决这个问题简单啊,在这个方法的开始加一行代码记录开始时间 beginTime,在方法的结尾加一行代码记录结束时间 endTime,结束时间 endTime 减去开始时间 beginTime 就是方法的执行时间,最后打印这个时间差就好了呀!”。
中级工程师 B 听了初级工程师 A 的解决方案后说:“你这个方案是能解决问题,但是我们系统里代码几万行,方法那么多,按你这个思路实现,不得累死大家啊!你的建议不妥,我们应该用代理模式来解决这个问题,写一个代理类来统一代理这些方法的执行时间的代码,那个 Spring 框架的 AOP 就能很好地解决这个问题啊!”。
高级工程师 C 点了点头说:“小 B 同学说的没错,解决这个问题的首选方案还是要用 AOP 切面编程,Spring 框架确实可以完美地解决这个问题,你们知道 Spring AOP 是如何实现的吗?如果没有 Spring 框架,我们自己写代码的话,如何实现这个功能呢? ”。
A 和 B 顿时来了兴趣,不约而同地看向高级工程师 C,异口同声地说:“C 哥,那你给我们讲讲呗......”。
2
自定义 AOP 框架介绍
我们今天实现的这个 AOP 框架主要的功能就是完成统计方法执行的时间,用到的例子是上篇文章中的订单服务、用户服务、支付服务,对这几个概念不了解的同学,建议阅读 代理设计模式与AOP 一文,然后再来阅读下面的内容。
自定义 AOP 框架里有以下几个部分:
1、Advice 接口:用于定义方法的功能增强的接口
2、Advice 接口的实现类 ExecutionTimeAdvice:方法执行时间统计功能增强的实现类
3、BeanFactory 类:创建对象的工厂类,用它创建对象类似于用 new 关键字实例化一个对象。
4、BeanFactoryProxy 类:创建对象的工厂类 BeanFactory 的代理类,用它来代理具体类的对象方法的执行,从而可以增强由它代理的类的方法的功能,比如实现方法执行时间的统计。
5、config.properties 配置文件:用来配置实体类 bean 以及功能增强类 advice。
代码结构如下图:
service 包下的代码详见