【ⓈSpring & Spring MVC】围绕 Spring AOP 能提出哪些面试问题?

AOP是什么?

与OOP对比,AOP是面向切面编程。传统OOP开发中,代码逻辑是至上而下的,过程中会出现一些横切性问题,这些横切性的问题和我们的主业务逻辑关系散落在代码的各个地方,造成难以维护,AOP的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来)

AOP的应用场景有哪些呢?

  • 日志记录
  • 权限验证
  • 事务管理(spring 的事务就是用AOP实现的)

Spring Aop的底层是怎样实现的?

  • JDK动态代理
  • CGLIB代理

是编译时期进行织入,还是运行期进行织入?

运行期,生成字节码,再加载到虚拟机中,JDK是利用反射原理,CGLIB使用了ASM原理。

初始化的时候,已经将目标对象进行代理,放入到spring 容器中。

Spring AOP 默认使用jdk动态代理还是cglib?

要看条件,如果实现了接口的类,是使用jdk。如果没实现接口,就使用cglib。(能用 JDK 做动态代理就用 JDK,不能用 JDK 做动态代理就用 Cglib,即首选 JDK 做动态代理。)

jdk动态代理是jdk自带的,所以使用它不需要额外导入jar包,它是基于反射机制实现的,当需要代理的真实类继承了接口时,spring默认使用jdk动态代理。

cglib动态代理需要导入相应jar包,它是基于字节码的,是生成了代理真实类的子类,无论代理真实类有没有实现接口都可以使用。

spring的proxy-target-class属性可以配置动态代理的方式。设置为 true 使用 cglib;设置为 false 使用 jdk,但是要注意,如果需要代理的真实类没有实现接口,不能强制使用jdk动态代理。

Spring AOP 和 AspectJ的关系?

两者都是为了实现AOP这个目的而出现的技术,spring aop 参考 AspectJ编程风格。在springAOP的实现中,借用了AspectJ的一些功能,比如@AspceJ、@Before、@PonitCut这些注解,都是AspectJ中的注解。在使用springAOP的时候需要引入AspectJ的依赖。

AspcetJ作为AOP的一种实现,是基于编译的方式实现的AOP,在程序运行期是不会做任何事情的,因为类和切面是直接编译在一起的,使用的是编译期和类加载时进行织入。

Spring AOP是基于动态代理的实现AOP,意味着实现目标对象的切面会创建一个代理类,利用的是运行时织入,在Spring AOP中连接点是方法的执行。

能不能简单说下AOP中的切面、切点、连接点、通知,四者的关系?

通知

就是我们编写的希望Aop时额外执行的那个方法。我们通过Aop希望我们编写的方法在目标方法执行前执行,或者执行后执行。

切点

切点就是我们配置的满足我们条件的目标方法。比如我们规定:名字前面是select开头的才执行我们自定义的通知方法。那么这些select开头的方法就是切点。

连接点

连接点可以说是切点的全集。切点是连接点的子集。也可以理解为,连接点是我们没有定义那个select开头规则时,满足条件的全部方法

spring允许你引用通知(Advice)的地方很多,基本每个方法的前、后以及前后都包括,或抛出异常时都可以是连接点,spring只支持方法连接点。

切面

切面是通知和切入点的结合。这里面没连接点什么事,连接点就是为了让你好理解切点搞出来的。通知说明了干什么和什么时候干(什么时候通过方法名中的befor,after,around等就能知道),切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

Spring AOP的开发步骤

1)导入aop相关坐标

2)创建目标接口和目标类

3)创建切面类:定义切入点(哪些条件需要增强)和通知(具体的增强逻辑)

posted @   残城碎梦  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示