interview
spring
Spring AOP默认用的是什么动态代理两者的区别

Spring 面试题, Spring AOP默认用的是什么动态代理,两者的区别?

Spring 面试题, Spring AOP默认用的是什么动态代理,两者的区别?

QA

Step 1

Q:: Spring AOP默认用的是什么动态代理?

A:: Spring AOP 默认使用的是 JDK 动态代理和 CGLIB 动态代理。如果目标类实现了接口,Spring 默认使用 JDK 动态代理;如果目标类没有实现任何接口,Spring 会选择使用 CGLIB 动态代理。JDK 动态代理通过实现接口来创建代理对象,而 CGLIB 通过生成目标类的子类来创建代理对象。

Step 2

Q:: JDK 动态代理和 CGLIB 动态代理的区别是什么?

A:: JDK 动态代理只能代理实现了接口的类,而 CGLIB 代理可以代理没有实现接口的类。JDK 动态代理在运行时通过反射机制生成代理类,而 CGLIB 则是在运行时生成目标类的子类并重写方法。因此,CGLIB 代理会稍微复杂一些,并且代理类的性能也比 JDK 动态代理稍差。此外,CGLIB 代理无法代理 final 类或 final 方法,因为它依赖于生成子类。

Step 3

Q:: 如何选择使用 JDK 动态代理还是 CGLIB 代理?

A:: 如果目标类实现了接口,Spring AOP 默认使用 JDK 动态代理,这通常也是最好的选择,因为它更简单且性能较好。如果目标类没有实现接口,Spring 会自动切换到 CGLIB 动态代理。你也可以通过配置强制使用 CGLIB 动态代理,例如在 Spring 配置中设置 proxyTargetClass=true。在实际项目中,应该根据类是否实现接口、性能需求和是否需要代理 final 类或方法来选择合适的代理方式。

Step 4

Q:: Spring AOP 是如何工作的?

A:: Spring AOP 是通过代理模式来实现的。当对目标对象的方法调用进行拦截时,AOP 框架会在调用目标方法之前和之后执行一些额外的逻辑,这些逻辑通常被称为“切面”。Spring AOP 的实现基于切点(Pointcut)和通知(Advice)。切点定义了在哪些方法上应用通知,通知则定义了在这些方法的哪个阶段(例如,方法执行前、方法执行后、抛出异常后)执行额外的逻辑。

Step 5

Q:: Spring AOP 和 AspectJ 有什么区别?

A:: Spring AOP 是基于代理的 AOP 实现,支持方法级别的切面,比较轻量级,适合用在常规的 Spring 项目中。AspectJ 是功能更强大的 AOP 框架,它是编译时增强(或加载时增强),不仅支持方法级别的切面,还支持构造函数、字段的拦截。AspectJ 提供了更强大的功能,但复杂度也更高,通常用于对性能要求较高或需要更精细的切面控制的场景。

用途

在面试中考察 Spring AOP 相关问题,主要是为了评估候选人对 Spring 框架内部原理的理解,特别是面向切面编程(AOP)的掌握程度。AOP 是实现横切关注点(如日志记录、事务管理、安全性检查等)的常用手段,能够有效减少代码重复,提高代码的模块化和可维护性。在实际生产环境中,Spring AOP 广泛用于事务管理、日志记录、安全认证和异常处理等场景,通过代理机制将这些通用功能模块化并动态地应用到业务逻辑中,减少了代码耦合,提高了系统的可扩展性和灵活性。\n

相关问题

🦆
什么是面向切面编程AOP?

面向切面编程(AOP)是一种编程范式,旨在通过分离横切关注点(如日志、事务、权限验证等)来提高代码的模块化。AOP 允许开发者在不修改原有业务逻辑的情况下,将横切关注点以切面的形式动态地应用到特定的方法或类上,从而减少代码冗余和增强系统的可维护性。

🦆
如何在 Spring 中配置 AOP?

在 Spring 中配置 AOP 可以通过 XML 配置或注解方式来实现。使用注解时,通常需要在配置类中启用 AOP(@EnableAspectJAutoProxy),然后在切面类上使用 @Aspect 注解,并在方法上使用 @Before@After@Around 等通知注解来定义具体的切面逻辑。通过配置,Spring 框架会自动管理这些切面,并将其应用到符合切点表达式定义的目标方法上。

🦆
什么是切点表达式,如何编写?

切点表达式用于定义哪些方法或类会被切面逻辑所应用。Spring AOP 中常用的切点表达式语言是 AspectJ 提供的,如 executionwithinthistarget 等。execution 用于匹配方法执行,语法类似于 execution(* com.example.service.*.*(..)),表示匹配 com.example.service 包下所有类的所有方法。正确编写切点表达式能够确保切面只作用于需要的部分,而不会误拦截其他不相关的逻辑。

🦆
如何在 Spring AOP 中处理异常?

在 Spring AOP 中,可以通过 @AfterThrowing 通知来处理方法执行过程中抛出的异常。该通知会在目标方法抛出异常后执行,你可以通过通知方法获取抛出的异常并执行相应的处理逻辑,例如记录日志或将异常转换为自定义异常抛出。在异常处理方面,AOP 允许开发者集中管理异常处理逻辑,而不必在每个业务方法中重复编写。

🦆
Spring AOP 的优缺点是什么?

Spring AOP 的优点包括简化横切关注点的实现、减少代码重复、提高模块化程度和增强系统的可维护性。它通过代理模式实现动态切面,易于集成到 Spring 项目中,配置灵活。缺点是由于基于代理的实现,可能对性能有一定影响,特别是在高并发场景下。另外,Spring AOP 只支持方法级别的切面,对于构造函数或字段的切面支持有限。