面试题1: Spring AOP是基于什么技术体系来实现的?
答案: Spring AOP的实现依赖代理机制。代理机制在具体实现上一般有两种方式,一种是静态代理机制,一种是动态代理机制。Spring AOP基于动态代理模式提供了面向切面机制。动态代理理解和实现起来比较复杂,我们专门通过一节内容对其进行了详细的阐述。而且动态代理机制的应用非常广泛,在Dubbo、MyBatis等框架中的应用方式和实现过程值得我们学习和模仿,同样这也是面试过程中经常会碰到的话题。
面试题2: Spring AOP中提供了哪些类型的通知机制?
答案: Spring AOP的通知机制类型非常丰富,开发人员可以在方法执行之前、之后、前后、返回以及抛出异常时实现各种自定义的通知逻辑。而且,Spring AOP实现通知的方式很简单,用一组注解即可,这些注解包括@Before、@After、@Around、@AfterReturning和@AfterThrowing等,分别对应于方法执行的各个阶段。
面试题3: Spring AOP使用了哪几种动态代理机制?性能上哪种更优?
答案: 常见的动态代理实现技术包括JDK自带的代理类、第三方的CGLIB和javassist。在回答该问题时,这三个名词是一定要点到的。至于具体的细节,可以视面试的进展合理进行展开,包括给出一些自己开发过程中的实践体会,或者部分核心类的介绍。
在Spring AOP中,采用了上述三种动态代理机制中的两种,即JDK和CGLIB。从性能上讲,JDK动态代理是优于CGLIB的,本章通过一个案例分析给出了这个结论。在面试过程中,可以把案例的设计方法和实现过程做一些展开。
面试题4: 如果想要在一个类的内部方法上实现AOP,你有什么办法?
答案: 关于Spring AOP有一点需要注意,我们只能在方法的调用过程中嵌入通知机制。这是很重要的一个限制,会导致对同一个类中的内部方法无法有效地实施动态代理。这时候,我们可以使用Spring AOP提供的AopContext上下文对象来获取当前的AOP代理。AopContext是一个非常有用的工具类,想要获取该类,需要确保ProxyFactoryBean的exposeProxy属性被设置为true。
面试题5: 如果想要基于Spring AOP实现对切点的精细化管理,你有什么策略?
答案: Spring AOP创建切点的方式是非常灵活的,Spring专门提供了一个execution()配置方法。开发人员可以根据方法的修饰符、返回值、类路径、方法名、方法参数以及异常信息来设置方法调用与切点的匹配规则。这是实现精细化管理的一个维度。
第二个精细化管理的维度是设置切点的粒度。我们可以尽量声明小的切点,并把它们组合起来构建复杂的切点。这样,切点之间就具备了灵活的可重用性以及组合性。