1. 什么是AOP?
更为准确的说AOP其实是一种软件设计思想,而不是一种特定技术,但是它又可以应用到任何的技术领域,只要是理解了AOP这种思想,其实都可以将它运用到项目中去。
既然说这到这个问题,那么到底什么是AOP?它又是应用在哪些场景下呢?
AOP在我看来可以用一句很简单的话来进行概述就是,“程序在运行时,动态的将代码切入到类的指定方法或者说指定位置上”,这就是AOP。这样说大家是不是有点明白了。
Java中面向对象的三大特征分为封装、继承、多态,假设现在有两个类,一个为Teacher(老师类)和Student(学生类),学生和老师都得吃饭、睡觉,但是老师和学生有具有自己的一些行为,比如老师会教书,但是学生不需要教书,学生却需要听课,根据面向对象的三大特征,我们可以将老师和学生的共同所具有的行为提取出来,让老师和学生去继承就可以,这样就提高了我们代码的复用性。
我曾经以为这样就很完美了,直到我遇到这种情况,这是一个方法,进入方法执行方法体的时候,要先开启事务,最后提交事务,并且每个方法都是受事务控制的,这样我们可以发现,出现了大量的重复代码,那么有没有什么什么比较好的办法,来解决这个问题呢?
画这样一个图,大家应该就可以看的更清楚了,我们的业务代码就是圈里面的核心,事务管理在圈的外层,我们的业务代码是受事务的管控的。
再来一个更直观的图,可以看到,现在将我们的业务代码和原来重复的代码进行了分离,独立为一个单独的模块,这样我们的业务中就不会有那么多冗余的代码了。但是大家可能又要问了,你这么分离出来,怎么样将它融合进去呢?其实这就是AOP解决的问题。
2. AOP的应用场景
从上面的例子中大家应该可以大致了解AOP的作用,那么在实际的开发中呢想要使用AOP它是需要一些场景的,像一些比较常见的场景就是:系统的性能检测、访问控制、事务管理以及日志记录。
我现在在做的项目中在权限控制、日志记录、匹配映射参数都是使用AOP来完成的,所以说搞懂AOP可以帮你做好多事情。
3. AOP的术语
在学习AOP之前,我们应该对AOP中的术语有一个清楚的认识,因为只有搞清楚这些东西,你才能搞懂AOP。
1) 连接点(JoinPoint)
什么是连接点,看了一下官方的,看完懵逼,说的太官方了,其实所谓的连接点就是“一个应用执行过程中能够插入一个切面的点”,比如说黑客攻击你的电脑,他总要找到一个入口,没有入口就无法进行攻击,连接点就相当于这个入口;
2) 切点(Pointcut)
一个程序中可能存在多个连接点,如果我们想要找到我们需要的连接点,那么就需要根据切点来进行定位;
3) 增强(Advice) 增强就是织入目标类连接点上的一段代码,就是黑客进入到你的电脑后要做的事情;
4) 目标对象(Targer)
增强逻辑的织入目标类,黑客攻击你的电脑,那么你的电脑就是目标类;
5) 引介(IntroductIon)
引介是一种特殊的增强,它为类添加了一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过AOP的引介功能,也可以动态地为该业务添加接口的实现逻辑,让业务类变成这个接口的实现;
6) 织入(Weaving)
织入其实就是将我们增强的代码添加到具体连接点上的过程;
7) 代理(Proxy)
一个类被AOP织入增强后,就产生了一个结果类,它融合了原类和增强逻辑的代理类;
8) 切面(Aspect)
切面有切点和增强组成,它既包括横切逻辑的定义,也包括连接点的定义;
通过前面简单的介绍,相比大家对AOP已经有了一个简单的认识,后面再说了一下AOP的一些术语,大家好好把这些理解一下,一定要把这些概念理清楚,后面才不会混淆。今天先带大家简单认识一下AOP,下篇带大家做一些例子,从而更亲近的认识AOP。