面试题:Spring 框架中AOP常见面试题

什么是AOP代理模式?
AOP代理模式是一种面向切面编程的设计模式,用于将横切关注点(如日志记录、事务管理等)与核心业务逻辑分离。
AOP代理模式的主要作用是什么?
AOP代理模式的主要作用是在不修改原有代码的情况下,通过动态代理的方式实现横切关注点的功能。
Spring 框架中AOP有哪几种创建代理的方式?(AOP代理模式有哪两种类型?
Spring 中的 AOP ⽬前⽀持 JDK 动态代理和 Cglib 代理
通常来说:如果被代理对象实现了接⼝,则使⽤ JDK 动态代理,否则使⽤ Cglib 代理。另外,也可以通过指定 proxyTargetClass=true 来实现强制⾛Cglib 代理。
JDK 动态代理和 Cglib 代理的区别?
1)JDK 动态代理本质上是实现了被代理对象的接⼝,⽽ Cglib 本质上是继承了被代理对象,覆盖其中的⽅法。
2)JDK 动态代理只能对实现了接⼝的类⽣成代理,Cglib 则没有这个限制。但是 Cglib 因为使⽤继承 实现,所以 Cglib ⽆法代理被 final 修饰的⽅法或类。
3)在调⽤代理⽅法上,JDK 是通过反射机制调⽤,Cglib是通过FastClass 机制直接调⽤。FastClass 简单的理解,就是使⽤ index 作为⼊参,可以直接定位到要调⽤的⽅法直接进⾏调⽤。
4)在性能上,JDK1.7 之前,由于使⽤了 FastClass 机制,Cglib 在执⾏效率上⽐ JDK 快,但是随着 JDK 动态代理的不断优化,从 JDK 1.7 开始,JDK 动态代理已经明显⽐ Cglib 更快了。
JDK 动态代理为什么只能对实现了接⼝的类⽣成代理?
根本原因是通过 JDK 动态代理⽣成的类已经继承了 Proxy 类,所以⽆法再使⽤继承的⽅式去对类实现代理。
AOP代理模式与静态代理模式有什么区别?
静态代理模式需要手动编写代理类,而AOP代理模式通过动态代理的方式自动生成代理类。
静态代理模式需要为每个被代理的类编写一个代理类,而AOP代理模式可以为多个类提供统一的代理。
Spring 的 AOP 是怎么实现的?
本质是通过动态代理来实现的,主要有以下⼏个步骤。
1)获取增强器,例如被 Aspect 注解修饰的类。
2)在创建每⼀个 bean 时,会检查是否有增强器能应⽤于这个 bean,简单理解就是该 bean 是否在
该增强器指定的 execution 表达式中。如果是,则将增强器作为拦截器参数,使⽤动态代理创建
bean 的代理对象实例。
3)当我们调⽤被增强过的 bean 时,就会⾛到代理类中,从⽽可以触发增强器,本质跟拦截器类
似。
你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介
(Introduction)、织⼊(Weaving)、切⾯(Aspect)这些概念?
a. 连接点(Joinpoint):程序执⾏的某个特定位置(如:某个⽅法调⽤前、调⽤后,⽅法抛出异常
后)。⼀个类或⼀段程序代码拥有⼀些具有边界性质的特定点,这些代码中的特定点就是连接点。
Spring仅⽀持⽅法的连接点。
b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,⼀个切点可以匹 配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
c. 增强(Advice):增强是织⼊到⽬标类连接点上的⼀段程序代码。Spring提供的增强接⼝都是带⽅ 位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。很多资料上将增强译
为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。
说明: Advice在国内的很多书⾯资料中都被翻译成"通知",但是很显然这个翻译⽆法表达其本质,有 少量的读物上将这个词翻译为"增强",这个翻译是对Advice较为准确的诠释,我们通过AOP将横切关 注功能加到原有的业务逻辑上,这就是对原有业务逻辑的⼀种增强,这种增强可以是前置增强、后置 增强、返回后增强、抛异常时增强和包围型增强。
d. 引介(Introduction):引介是⼀种特殊的增强,它为类添加⼀些属性和⽅法。这样,即使⼀个业 务类原本没有实现某个接⼝,通过引介功能,可以动态的未该业务类添加接⼝的实现逻辑,让业务类 成为这个接⼝的实现类。
e. 织⼊(Weaving):织⼊是将增强添加到⽬标类具体连接点上的过程,AOP有三种织⼊⽅式:①编 译期织⼊:需要特殊的Java编译期(例如AspectJ的ajc);②装载期织⼊:要求使⽤特殊的类加载 器,在装载类的时候对类进⾏增强;③运⾏时织⼊:在运⾏时为⽬标类⽣成代理实现增强。Spring采 ⽤了动态代理的⽅式实现了运⾏时织⼊,⽽AspectJ采⽤了编译期织⼊和装载期织⼊的⽅式。
f. 切⾯(Aspect):切⾯是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括 了对连接点的定义。
补充:代理模式是GoF提出的23种设计模式中最为经典的模式之⼀,代理模式是对象的结构模式,它 给某⼀个对象提供⼀个代理对象,并由代理对象控制对原对象的引⽤。
简单的说,代理对象可以完成⽐原对象更多的职责,当需要为原对象添加横切关注功能时,就可以使 ⽤原对象的代理对象。 我们在打开Office系列的Word⽂档时,如果⽂档中有插图,当⽂档刚加载时,⽂档中的插图都只是⼀ 个虚框占位符,等⽤⼾真正翻到某⻚要查看该图⽚时,才会真正加载这张图,这其实就是对代理模式 的使⽤,代替真正图⽚的虚框就是⼀个虚拟代理;
Hibernate的load⽅法也是返回⼀个虚拟代理对象,等⽤⼾真正需要访问对象的属性时,才向数据库 发出SQL语句获得真实对象

你可能感兴趣的:(面试题,spring,java,代理模式)