Spring AOP常见面试题
一、面试官问:AOP是什么?
与OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP的编程思想就是把业务逻辑和横切的问题进行分离,从而达到解耦的目的,使代码的重用性和开发效率高(目的是重用代码,把公共的代码抽取出来)
二、面试官问:AOP的应用场景有哪些呢?
1、日志记录
2、权限验证
3、效率检查(个人在代码上,喜欢用注解+切面,实现校验,redis分布式锁等功能)
4、事务管理(spring 的事务就是用AOP实现的)
三、面试官问:springAop的底层是怎样实现的?
(这个时候,条件反射地想起这两点)

1、JDK动态代理
2、CGLIB代理
面试官一问:是编译时期进行织入,还是运行期进行织入?
---->运行期,生成字节码,再加载到虚拟机中,JDK是利用反射原理,CGLIB使用了ASM原理。
面试官再问:初始化时期织入还是获取对象时织入?
----》初始化的时候,已经将目标对象进行代理,放入到spring 容器中
面试官再再问:spring AOP 默认使用jdk动态代理还是cglib?
-----》要看条件,如果实现了接口的类,是使用jdk。如果没实现接口,就使用cglib。
(来一个尴尬的笑容,有点忘记了,内心,直接泪目)

四、面试官问:spring AOP 和 AspectJ的关系?
1、两者都是为了实现AOP这个目的,而出现的技术,spring aop 参考 AspectJ编程风格
---》这里有个故事就是,原本spring aop 初期的时候所用的编程风格,让人用起来,很不方便,而且让人看不懂。后来,spring aop 就开始取用了Aspectj的编程风格去进行编程
这里有一个小彩蛋(如果知道,请跳过),搭建一个用上spring,但是不使用xml文件,而且将bean注入到容器中,而且能从容器中拿出来的项目。
第一步骤:加入spring-context依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
第二步骤:加入三个类,一个测试类
@Configuration
@ComponentScan("com.ving")
public class AopConfig {
} //////////////////////////////////////////////// @Component
public class IndexDao { public void query(){
System.out.println("dao----query");
}
} //////////////////////////////////////////////// public class Test {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AopConfig.class);
annotationConfigApplicationContext.start();
IndexDao bean = annotationConfigApplicationContext.getBean(IndexDao.class);
bean.query(); }
} //////////////////////////////////////////////// 打印的结果为: 十二月 16, 2019 8:58:38 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6438a396: startup date [Mon Dec 16 20:58:38 CST 2019]; root of context hierarchy
dao----query
我们继续往下看
面试官最后一问:能不能简单说下AOP中的切面、切点、连接点、通知,四者的关系?

aspect 切面
Point cut (如果理解了这个切点的概念,就在应用方面完全是可以的了)表示连接点的集合(类似一个表)
Join point 目标对象中的方法(每一条记录)
weaving 把代理逻辑加入到目标对象上的过程叫做织入
advice 通知类型,请下下图官网说明

下面代码是说明切面,切点,连接点,通知,四者的关系!
/**
*
* 切面
* 一定要给spring 管理
*/
@Component
@Aspect
public class VingAspectJ { /**
* 切点
* 为什么切点要声明在一个方法上?目的是为了将注解写在上面而已
* pointcut是连接点的集合(就是方法的集合)
*/
@Pointcut("execution(* com.ving.dao.*.*(..))")
public void pointCut(){ } /**
* 通知---》配置切点
*/
@After("com.ving.config.VingAspectJ.pointCut()")
public void after(){
System.out.println("after");
} @Before("com.ving.config.VingAspectJ.pointCut()")
public void before(){
System.out.println("before");
}
}
Spring AOP常见面试题的更多相关文章
- 死磕Spring之AOP篇 - Spring AOP常见面试题
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 关于Spring的常见面试题
1.Spring是什么? Spring是一个轻量级的IoC和AOP容器框架.是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求.常见的配置方 ...
- (Java基础--Spring阶段)常见面试题题目及解析整理(2021.03.12)
题目整理 Java基础进阶阶段 基础概念类 1.JDK1.8新特性? 2.面向对象和面向过程的区别? 3.什么是值传递和引用传递? 4.什么是不可变对象? 5.讲讲类的实例化顺序? 6.java 创建 ...
- 互联网大厂Java面试题集—Spring boot常见面试题(二)
Spring Boot的核心功能与使用优点? 核心功能: 1)Spring Boot项目为独立运行的spring项目,java -jar xx.jar即可运行. 2)内嵌servlet容器(可以选择内 ...
- spring cloud 常见面试题 来理解微服
为什么要谈 这些理论知识呢 理论知识 = 面试时候的谈资 !!! 你只有 进去公司 才有资格 去做一个码农 ok 话不多说 经历如此漫长的互联网发展 以本人的拙见 软件开发 粗略的 分为 ...
- Spring 常见面试题总结 | JavaGuide
首发于 JavaGuide 在线网站:Spring 常见面试题总结 最近在对 JavaGuide 的内容进行重构完善,同步一下最新更新,希望能够帮助你. Spring 基础 什么是 Spring 框架 ...
- SpringMVC常见面试题总结(超详细回答)
SpringMVC常见面试题总结(超详细回答) 1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的 ...
- Vue常见面试题汇总
Vue框架常见面试题 1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么 ...
- 【搞定 Java 并发面试】面试最常问的 Java 并发基础常见面试题总结!
本文为 SnailClimb 的原创,目前已经收录自我开源的 JavaGuide 中(61.5 k Star![Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.欢迎 Sta ...
随机推荐
- js中逻辑运算符||和&& 的返回值并不只有true和false
以前我一直认为逻辑运算符的返回值一直是true或者false,其实根本就没考虑过它又返回值,一直是在if判断语句中作为一个条件使用,只是为了能让条件正确与否进入if语句.根本就没用到逻辑运算符的返回值 ...
- 关于SpringMVC的几件小事
一.SpringMVC表单标签He处理静态资源 1.Spring的表单标签 通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. ...
- arcgis js之点击获取featureLayer中的点
arcgis js之点击获取featureLayer中的点 代码: this.view.on('click', (evt) => { let layer = this.map.findLayer ...
- Spring Cloud(七)服务网关 Zuul Filter 使用
上一篇文章中,讲了Zuul 转发,动态路由,负载均衡,等等一些Zuul 的特性,这个一篇文章,讲Zuul Filter 使用,关于网关的作用,这里就不再次赘述了,重点是zuul的Filter ,我们可 ...
- 使用pycharm 编写代码 并在远程主机上运行
一 要求 远程主机有python解释器 二 在菜单栏,File -> Settings… -> Project ×× -> Project Interpreter,点击右侧 Add按 ...
- celery最佳体验
目录 目录 不使用数据库作为 Broker 不要过分关注任务结果 实现优先级任务 应用 Worker 并发池的动态扩展 应用任务预取数 保持任务的幂等性 应用任务超时限制 善用任务工作流 合理应用 a ...
- Java虚拟机(JVM)知多少
本文大量参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html 概述 JVM是JRE的一部分.它是一个虚构出来的计算机,是通过在实际的计算机上仿 ...
- 《浏览器工作原理与实践》<04>从输入URL到页面展示,这中间发生了什么?
“在浏览器里,从输入 URL 到页面展示,这中间发生了什么? ”这是一道经典的面试题,能比较全面地考察应聘者知识的掌握程度,其中涉及到了网络.操作系统.Web 等一系列的知识. 在面试应聘者时也必问这 ...
- 04_Hive的基本命令
1.Hive基本操作: 1.1.Hive的建表语句: CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [ ...
- Visual Studio中使用GitHub
一.简介 GitHub被微软收购后免费开放了私人仓库,这对个人或小型团队来说简直是福音.GitHub高效免费,无论是团队代码管理还是DevOps都不再话下,特别是对于想要开放研究成果提高知名度的团队或 ...