[面试原题]
Action类的定义如下:
为该类的actionSomeThing方法定义的切面拦截如下:
请问在执行Action对象的actionSomeThing()时的输出是什么?
A. 123456 B. 654321 C. 521643 D.521463
[正确答案]
C
[面试技术点]
Spring AOP定义以及切面执行顺序。
[解读]
AOP技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
本例中@Pointcut("execution(* com.bwf.web.Action*.*(..))")定了一个切入点,正则表达式的意思是在执行com.bwf.web.Action类的所有方法时,将会发送performance切入点通知。
@Before是在所拦截方法执行之前执行一段逻辑。
@After 是在所拦截方法执行之后执行一段逻辑。
@Around是可以同时在所拦截方法的前后执行一段逻辑。
@AfterReturning在所拦截方法return后执行该注解的函数。
本例中,首先要执行的是@Around注解的函数,所以,先打印5。obj = joinpoint.proceed();调用的就是Action中的actionSomeThing函数本身。那么在执行actionSomeThing函数前,首先要执行@Before注解函数,因此,再打印2。之后是performance函数执行,打印1,接下来执行around的最后一步输出,打印6。然后拦截函数执行完毕,调用@After注解函数,打印4。最后拦截函数return后,执行@AfterReturn注解函数,打印3。