首页 > 其他分享 >围绕 Spring AOP 能提出哪些面试问题?

围绕 Spring AOP 能提出哪些面试问题?

时间:2023-03-21 09:13:17浏览次数:38  
标签:jdk 连接点 spring 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等就能知道),切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。

 

标签:jdk,连接点,spring,Spring,代理,切点,面试,AOP
From: https://www.cnblogs.com/xfeiyun/p/17238688.html

相关文章

  • 2万字70道Java经典面试题总结(附答案)
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • springboot 接入 ChatGPT
    介绍lucy-chat是接入OpenAI-ChatGPT大模型人工智能的Java解决方案,大模型人工智能的发展是不可阻挡的趋势,我们环境无法创造工具,但是也要更好的使用工具,该包简化了接......
  • 12_SpringBoot_整合Thymeleaf_掌握
       Thymeleaf的主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。Thymeleaf能够处理HTML,XML,Ja......
  • 12_SpringBoot_整合Thymeleaf_掌握
       Thymeleaf的主要目标是将优雅的自然模板带到开发工作流程中,并将HTML在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。Thymeleaf能够处理HTML,XML,Ja......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarker......
  • 15_SpringBoot_模板引擎总结_了解
    jsp优点:1、功能强大,可以写java代码2、支持jsp标签(jsptag)3、支持表达式语言(el)4、官方标准,用户群广,丰富的第三方jsp标签库缺点:性能问题。不支持前后端分离freemarker......
  • 16_SpringBoot_开发者工具_了解
     使用开发者工具包不需要重启。监听内容改变。1导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-d......
  • 16_SpringBoot_开发者工具_了解
     使用开发者工具包不需要重启。监听内容改变。1导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-d......
  • SpringBoot-jar和war方式打包部署项目
    携手创作,共同成长!这是我参与「掘金日新计划·8月更文挑战」的第30天,点击查看活动详情SpringBoot项目开发完成后,需要以jar或war的方式将项目打包部署到测试开发环境。......
  • Spring Cloud Alibaba系列(一)限流与防护组件Sentinel的简单使用
    Sentinel是SpringCloudAlibaba体系的安全防护组件,我们可以使用它以“非业务侵入”方式实现限流,熔断,服务降级需求。一.下载并启动Sentinel控制台从GitHub网址https......