1. 什么是 Spring AOP?
- Spring AOP(面向切面编程)是一种框架功能,用于提供 declarative 编程方式来实现代码的横向关注点,如日志、事务管理、权限控制等。它通过预编译或运行时动态代理,在不修改原有业务逻辑代码的基础上,将通用的交叉性行为织入到特定的切入点。
2. Spring AOP 的设计原理
- Spring AOP 基于代理设计模式,使用两种主要的代理机制:JDK 动态代理或者CGLIB代理。当客户端请求到达时,代理对象处理请求,根据AOP配置在调用真实目标方法前后执行相应的通知方法。
3. 代理如何进行创建和调用的?
- 创建:
- JDK动态代理:若目标类实现了接口,Spring会自动创建一个代理类,该代理类继承
java.lang.reflect.Proxy
并实现目标类的所有接口。 - CGLIB代理:若目标类没有实现接口,则Spring使用CGLIB库生成目标类的子类作为代理,并覆盖其中的方法以插入切面逻辑。
- JDK动态代理:若目标类实现了接口,Spring会自动创建一个代理类,该代理类继承
- 调用:
- 客户端通常持有对代理对象而非实际目标对象的引用,从而调用的是代理对象的方法。代理对象在执行目标方法前、后或环绕执行时触发相应的切面逻辑。
4. Spring 中有哪些通知类型(advice)?
- 前置通知(
Before Advice
):在目标方法执行前调用的通知。 - 后置通知(
After Returning Advice
):在目标方法正常返回后调用的通知。 - 异常后置通知(
After Throwing Advice
):在目标方法抛出异常后调用的通知。 - 最终通知(
After (Finally) Advice
):无论目标方法是否正常完成都会执行的通知。 - 环绕通知(
Around Advice
):包围目标方法执行,可以决定何时调用方法体,以及何时退出。
5. 在 Spring AOP 中关注点和横切关注点的区别
- 关注点(Concern):是软件系统中需要被处理的功能模块,例如事务管理、日志记录等。
- 横切关注点(Cross-cutting Concern):是那些跨越多个对象的行为或责任,它们与业务逻辑相分离,且影响整个应用的多个组件。例如,安全性、缓存、审计等就是典型的横切关注点。
6. Spring AOP 的代理是什么?
- Spring AOP 的代理是基于代理模式创建的一个对象,这个对象代表了原始的目标对象并在代理方法调用时增加了额外的横切逻辑。
7. AspectJAutoProxyRegistrar 类的作用
AspectJAutoProxyRegistrar
是 Spring AOP 和 AspectJ 整合时使用的类,它是一个 Bean 后处理器,负责注册一个 Advisor Bean 用于创建和管理代理对象,使得 Spring 容器能够自动为符合条件的 Bean 创建代理并应用切面。
8. 代理对象创建
- 在 Spring 容器启动过程中,当检测到某个 Bean 配置了切面时,会根据 AOP 配置自动创建对应的代理对象。具体创建过程包括解析切点表达式、生成通知链、结合目标对象生成代理实例。
9. 代理对象调用目标方法
- 当调用代理对象的方法时,代理对象首先识别调用是否匹配任何切点表达式。如果匹配,对应的前置、环绕等通知将会按顺序执行。最终,实际的目标方法会被调用,并在方法结束后执行相应的后置通知等逻辑。