AOP(Spring的面向切面编程)

面试笔试Spring框架必问问题之一。这里就百度图镇楼一下,方便想背熟概念的同学。

在这里插入图片描述

概念中也很明确说了,是基于动态代理技术实现的:

动态代理技术,就是运行期间根据切面类方法动态地对现有方法进行增强。在不修改代码的前提下增强原来方法的功能。
说人话:比如玩LOL或者王者荣耀,买装备,一件大装备都是从一件小装备开始,慢慢购买更多的零散的增强型小装备,组合成大装备。这里一开始购买的小装备,就是原有的方法,通过动态代理技术在运行期间给你加上一个又一个牛逼哄哄的功能,使你原来写的方法变得异常强大,这就是动态代理。
例子2:我们买电脑都是通过经销商买的,经销商就是获得了代理权,从苹果公司拿过来的电脑,卖给我们,还给我们提供了贴膜,售后服务,免费下载等等附加服务项。这就是动态代理,从简单到丰富,从服务性能弱到服务性能强,从不完善到完善。
相比起IOC,这个肯定好理解很多,直接上例子了:

有一个模块,是审核订单的,这个模块的所有接口有着严格的权限控制和事务管理和日志输出,执行的每一步操作前都要判断登陆状态,判断当前操作者权限,控制事务的commit 和 rollback,那么我们一开始做是怎么做?每次调用到这个模块的任意一个接口,都注入一遍登陆判断,权限控制,事物控制,输出日志的Service代码?那假如,我这个模块有100个接口,100个实现类,100个ServiceImplement,不麻烦吗?每个方法前后左右都塞满了一样的代码,不麻烦吗?

所以AOP就是为了解决这种问题的,这里有几个概念一定要清楚的理解:

(1)连接点JoinPoint:

简单的说就是一些被调用的方法,一些接口方法,都可以作为连接点,连接点的作用就是为下一步的切入点做准备,同时并不是全部连接点都会被切入,正如并不是所有接口都会需要用到权限判断和事务管理和日志输出之类。这里的连接点是一个很广的概念。代表有可能成为进入切入点的所有地方,所有接口方法都会被拦截,并且判断是否是需要被增强的类。

(2)切入点PointCut :

简单的说就是需要被增强的方法,这里就不能直接执行原来的简单的业务逻辑,而是通过增强的代理类去执行。 通过注解@PoinCut(execution(“XXXX...*(…)”))来指定当前哪个目录下的方法或者接口为切入点。

连接点不一定是切入点,但是切入点就一定是连接点。

(3)通知advise:

其实就从切入点进入增强代理类后,通知该先做什么,再做什么,最后做什么的一个顺序通知,也可以看成它是一个排号机器,叫号让方法排队一个个执行。
比如说上面的切入点是一个审核接口,审核方法。切入增强方法后,先进行登陆判断,再进行权限判断,再进行原来的审核方法,再进行事物控制,最后打印日志输出。
通知就分五种,对应着五种它们自己独特的注解标签:

1:前置通知(@Before,用于控制在业务方法执行前先执行增强方法)
2:后置通知(@AfterReturning,用户控制在业务方法执行之后才能执行的增强方法)
3:异常通知(@AfterThrowing,在执行过程中出现异常该执行的增强方法)
4:最终通知(@After,用于在所有方法都执行完之后才执行的增强方法)
5:环绕通知(@Around,它是环绕在整个增强方法执行的每个过程)

(4)切面Aspect:

切面其实就是一个概念,并没有具体哪一个方法哪一个类代表的就是切面。它可以通过@Aspect注解标明当前类是一个切面类,再通过上面的通知注解和切入点注解实现方法的增强。在切面,就跟五花肉一样清晰看到哪些是原来的方法,哪些是额外增加的增强型方法。

(5)织入:

这里其实是一个动作,就是把增强型方法加入到原有的方法中去,因为像一丝一缕一样通过五种不同执行时间的通知类型渗透进去,就像织入一样紧密,所以把这一个动作叫做织入。给我命名我宁愿叫植入,植入广告的植入,更加好理解,看电影看到一半,植入广告,广告卖完,继续放电影。

(6)引介:

我对这个概念真的很无语,它的作用是在不修改原来方法代码的前提下,运行期动态地添加增强方法,并且对外提供的都是动态代理模式下生产出来的增强型方法,它就叫引介,要我命名的话我叫他中介,或者中间商,或者98佬。
概念和注解标签都介绍了,具体功能实现网上太多了,这里我就不列出来给大家了,反正看别人写的代码都是头晕的。
记住配置完AOP之后还要开启,如果是通过XML配置的,那就简单点通过XML配置文件开启,就在你写的一堆堆外面,直接添加<aop: aspectj-auto proxy> </aop: aspectj-autoproxy>就开启了,如果是通过全注解方法,把XML都删掉的话,那就要在配置类(也就是你用@Configuration修饰了的,还用@Component San指定了包扫描路径的那个类),添加上@EnableAspectJAutoProxy就可以了。

忙活完这一套玩意,AOP帮我们做了些什么呢?我们照常写接口代码,然后指定哪些模块的接口方法需要用到动态代理来融入增强方法。那么在访问那些被指定为切入点的接口方法的时候,Spring就会拦截到,进入切面类,并且按照通知的顺序,依次按顺序执行。

点击通过审核方法-》拦截-》判断到是切入点方法-》进入切面类-》先进行登陆验证-》进行权限验证-》通过审核-》记录操作日志。

所以这么一整套流程,就是Spring帮我们轻松做完,我们根本不需要重复写代码和重复修改代码,需要写的仅仅是最简单的一个业务接口方法而已。把可复用的模块抽出来,要用的时候再织入,省去了CV开发时间。

猜你喜欢

转载自blog.csdn.net/whiteBearClimb/article/details/104272468