面试笔试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,它是环绕在整个增强方法执行的每个过程)