Java面试题-Spring框架
Spring框架
1. BeanFactory和ApplicationContext有何区别
BeanFactory是Spring最底层的接口,是IoC的核心,定义IoC的基本功能。
BeanFactory具有:延迟实例化的特性。在启动的时候,不会实例化Bean,只有有需要从容器中获取Bean才会实例化Bean。(一般用在移动设备等内存较小的地方)
ApplicationContext是BeanFactory子接口,相较于BeanFactory多提供:国际化、资源访问、AOP等功能。
ApplicationContext在启动的时候,会实例化所有Bean,可以为Bean配置Lazy-init实现延迟实例化。
2. Spring Bean的生命周期
一、加载Bean定义
1、loadBeanDefinitions:将Bean定义记录在beanDefinitionMap中
registerBeanDefinition类-> registerBeanDefinition()方法
二、创建Bean对象
1、构建对象
通过遍历对对象进行逐个构造。
AbstractAutowireCapableBeanFactory类->createBeanInstance()
2、填充属性
populateBean()
3、初始化
initializeBean()
3.1:applyBeanPostProcessorsBeforeInitialization():初始化前应用Bean后置处理器
3.2:invokeInitMethods():初始化
3.3:applyBeanPostProcessorsAfterInitialization():初始化后应用Bean后置处理器
三、使用
初始化完成后的Bean对象即可正常使用。
四、销毁
1、销毁前
@PreDestory注解的方法
2、销毁
DisposableBean->destory()
Bean->destory-method()
3. Spring IOC如何实现
IoC:Inversion of Control 控制反转。
通俗易懂的理解:我们拥有创建对象的控制能力,反转为由程序进行创建对象,不在由我们去创建对象。
IoC有多种实现方式,其中最常见的DI(Dependency Injection 依赖注入)。对象通过构造方法参数、工厂方法参数、构造或工厂方法返回后在对象实例上设置的属性来定义它们的依赖项,从类外部注入依赖(容器在创建bean时注入这些依赖项)。
Spring常见依赖注入有3种方式:1、构造方法 2、set 3、注解注入@Autowired
Spring提供了两种IoC容器:
1、BeanFactory
2、ApplicationContext
具体可参考 面试题1
在了解了Spring Bean的生命周期后,我们能够发现Bean对象的创建已经不是由我们手动创建了,而是通过Spring底层的组件进行加载->创建->销毁,这一过程就是Spring IoC的过程。
4. 说说Spring AOP及实现原理
4.1 AOP概念
AOP:Aspect Orient Programming 面向切面编程。
目的:在不修改源代码的情况下,实现添加额外功能的技术。
个人理解:源代码为一颗笔直的树,需要在这棵树上看到更多的种类,在树旁重新栽显然耗时费力,此时通过嫁接技术,在树的切面嫁 接即可实现目的。(AOP)
4.2 AOP使用
具体使用可参考:https://blog.csdn.net/Cr1556648487/article/details/126777903
4.3 AOP原理
SpringAOP底层采用动态代理,支持JDK动态代理以及Cglib动态代理。
JDK动态代理只能为接口创建动态代理实例。需要获得被代理类的接口信息,通过反射生成一个实现代理接口的动态代理类,然后通过构造方法生成动态代理类的实例对象,在调用具体方法前使用invokeHandler()处理。
Cglib动态代理以来asm包,把被代理类的字节码加载进来,生成其子类。
5. 动态代理(cglib与JDK)
JDK动态代理:
通过实现InvocationHandler接口的invoke()方法定义切面逻辑。
使用条件:
- 1、业务目标对象只能为接口创建代理实例
- 2、拦截器实现
InvocationHandler - 3、通过
Proxy.newProxyInstance()生成代理对象
Cglib动态代理:
基于ASM字节码生成库,允许在运行时对字节码修改和动态生成。
JDK动态代理与Cglib动态代理区别
-
JDK动态代理只针对接口实现类进行代理。也就是只面向接口。
-
Cglib针对类实现代理,采用的是继承方法。
6. Spring事务实现方式
-
编程式事务
概念:在业务代码中精确定义事务边界
代码块中调用:
beginTransaction()、commit()、rollback()等相关方法 -
声明式事务
有助于用户将操作与事务规则进行解耦。简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。
使用:
@EnableTransactionManagement:开启事务管理
@Transactional:开启事务
@Transactional事务注解失效原因:
- 方法修饰符不为
public - 方法内部调用事务
- 事务内捕获异常,未抛出新异常
- rollbackFor属性配置错误
7. Spring事务的底层原理
使用事务步骤:
- 获取数据库连接
- 开启事务
- 执行数据操作
- 提交事务/回滚事务
- 关闭连接
Spring在框架中做了开启事务、提交事务、回滚事务的操作,使得业务代码和事务代码解耦。这一功能是基于AOP实现的。
8. 自定义注解实现功能
参考:https://www.jianshu.com/p/7c2948f64b1c
9. SpringMVC运行流程

核心代码:DispatcherServlet.java -> doDispatch()
- 用户请求
- DispatcherServlet中央调度器通过请求查找HandlerMapping获取Handler
- DispatcherServlet中央调度器通过Handler查找HandlerAdapeter
- 处理器适配器调用用户编写的controller,返回ModelAndView(基于JSON交互的,返回ModelAndView为空,此时前端已能接收到返回值)
- DispatcherServlet中央调度器通过
ModelAndView查找对应ViewResolver,返回View - 渲染View
- 返回渲染后的View
10. SpringMVC启动流程
详情查看:https://blog.51cto.com/u_9587581/2398187
11. Spring的单例实现
Spring的单例模式是采用:单例注册表实现的。
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
private final Map<String, Object> earlySingletonObjects = new ConcurrentHashMap<String, Object>(16);
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);//Spring获取单例模式方法
protected Object getSingleton(String beanName, boolean allowEarlyReference) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null && allowEarlyReference) {synchronized (this.singletonObjects) {singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null) {singletonObject = this.earlySingletonObjects.get(beanName);if (singletonObject == null) {ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);if (singletonFactory != null) {singletonObject = singletonFactory.getObject();this.earlySingletonObjects.put(beanName, singletonObject);this.singletonFactories.remove(beanName);}}}}}}return singletonObject;}
这里有3个Map集合:singletonObjects、earlySingletonObjects、singletonFactories
单例获取顺序为:singletonObjects -> earlySingletonObjects -> singletonFactories
singleonObjects:单例对象的cacheearlySingletonObjects:提前曝光的单例对象的cachesingletonFactories:单例对象工厂的cache
12. Spring中使用了哪些设计模式
1、工厂模式:BeanFactory、ApplicationContext
2、单例模式:Bean默认为单例模式
3、代理模式:AOP功能用到了JDK动态代理和Cglib动态代理
4、适配器模式:Spring AOP 的拦截器使用到了适配器模式
相关文章:
Java面试题-Spring框架
Spring框架 1. BeanFactory和ApplicationContext有何区别 BeanFactory是Spring最底层的接口,是IoC的核心,定义IoC的基本功能。 BeanFactory具有:延迟实例化的特性。在启动的时候,不会实例化Bean,只有有需要从容器…...
【计算机物理模拟】-力矩、转动惯量和角速度之间的关系
力矩和角速度之间的关系可以通过牛顿第二定律和角动量定理来描述。 牛顿第二定律表明,物体的加速度与作用在物体上的合力成正比,加速度的方向与合力的方向相同。而对于旋转运动的物体,其加速度可以表示为半径 rrr 乘以角加速度 α\alphaα&a…...
async和await用法理解和快速上手 , 同步任务和异步任务顺序安排和轻松理解 , js代码执行顺序表面知道
学习关键语句 : async , await 用法 await 怎么使用 同步任务和异步任务 微任务和宏任务 js中代码执行顺序 写在前面 虽然说 async 和 await 是 Promise 的语法糖 , 但是用惯了Promise 的人(我) , 还真不能超快速使用上这个语法糖 , 所以赶紧写一篇文章出来让各位了解了解这个…...
Linux下java服务占用cpu过高如何处理
Linux下java服务占用cpu过高如何处理 top命令查看进程信息 top按下shiftp,按cpu使用率排行,可见进程1932占用最高,并且是一个java服务 使用jps命令确认java服务 [rootVM-16-16-centos ~]# jps 1011 Jps 9462 yuan_back-0.0.1-SNAPSHOT.jar 1932 spigot-1.18.jar查找异常进程中…...
ros下用kinectv2运行orbslam2
目录 前提 创建工作空间 orbslam2源码配置、测试: 配置usb_cam ROS功能包 配置kinect 前提 vim 、 cmake 、 git 、 gcc 、 g 这些一般都装了 主要是Pangolin 、 OpenCV 、 Eigen的安装 18.04建议Pangolin0.5 创建工作空间 我们在主目录下创建一个catkin_…...
MVP简单模型搭建【架构】
MVP简介 MVP是一种项目架构设计模式(说白了就是我们产品的一种设计方案) 其实MVP本质 就是将View和Model完全隔离,通过Presenter统一调度管理(Presenter扮演着中介的角色)传统的设计思路是我们直接跟房东谈࿰…...
若依ruoyi框架实现目录树与查询页面联动
目录1、业务场景2、前端api.js修改index.vue修改template修改script修改3、后端controllerserviceimpldomainentitytreeselect1、业务场景 后管页面实现目录数与查询页面的联动,类似若依框架用户管理页面。 2、前端 api.js修改 在原有的js文件里配置目录树的查…...
Laravel框架学习笔记——Laravel环境配置及安装(Ubuntu20.04为例)
目录引言1、安装Nginx2、安装PHP3、安装Composer4、搭建Laravel框架项目5、修改Nginx映射6、安装MySQL引言 好久没写博客了,因为个人需要, 所以要涉及到Laravel框架的学习,所以会出一系列的关于PHP的Laravel框架学习笔记,希望能够…...
模拟百度翻译-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)
【案例6-5】 模拟百度翻译 【案例介绍】 1.任务描述 大家对百度翻译并不陌生,本案例要求编写一个程序模拟百度翻译。用户输入英文之后搜索程序中对应的中文,如果搜索到对应的中文就输出搜索结果,反之给出提示。本案例要求使用Map集合实现英…...
自然语言处理(NLP)之求近义词和类比词<MXNet中GloVe和FastText的模型使用>
这节主要就是熟悉MXNet框架中的两种模型:GloVe和FastText的模型(词嵌入名称),每个模型下面有很多不同的词向量,这些基本都来自wiki维基百科和twitter推特这些子集预训练得到的。我们只需要导入mxnet.contrib中的text模块即可,这里…...
2023年CDGA考试-第13章-数据质量(含答案)
2023年CDGA考试-第13章-数据质量(含答案) 单选题 1.在导致数据质量问题的常见原因中关于数据输入问题以下描述正确的是: A.数据采集端缺乏数据质量管控 B.相同字段重复设计导致数据不一致 C.缺乏数据采集规范的制定 D.所有描述都正确 答案 D 2.数据质量计划应将其范围限…...
ASEMI高压MOS管ASE65R330参数,ASE65R330图片
编辑-Z ASEMI高压MOS管ASE65R330参数: 型号:ASE65R330 漏极-源极电压(VDS):650V 栅源电压(VGS):20V 漏极电流(ID):12.5A 功耗(P…...
LeetCode动态规划经典题目(九):子序列、子数组问题
目录 31. LeetCode674. 最长连续递增序列 32. LeetCode18. 最长重复子数组 33. LeetCode1143. 最长公共子序列 34. LeetCode1035. 不相交的线 35. LeetCode53. 最大子数组和 36. LeetCode392.判断子序列 37. LeetCode115. 不同的子序列 38. LeetCode583. 两个字符串的删…...
如何利用有限的数据发表更多的SCI论文?——利用ArcGIS探究环境和生态因子对水体、土壤和大气污染物的影响
SCI的写作和发表是科研人提升自身实力和实现自己价值的必要途径。“如何利用有限的数据发表更多的SCI论文?”是我们需要解决的关键问题。软件应用只是过程和手段,理解事件之间的内在逻辑和寻找事物之间的内在规律才是目的。如何利用有限的数据发表更多的…...
六【 SpringMVC框架】
一 SpringMVC框架 目录一 SpringMVC框架1.什么是MVC2.SpringMVC概述3.SpringMVC常见开发方式4.SpringMVC执行流程5.SpringMVC核心组件介绍6.快速构建Spring MVC程序✅作者简介:Java-小白后端开发者 🥭公认外号:球场上的黑曼巴 🍎个…...
【BBuf的CUDA笔记】八,对比学习OneFlow 和 FasterTransformer 的 Softmax Cuda实现
0x1. OneFlow/FasterTransformer SoftMax CUDA Kernel 实现学习 这篇文章主要学习了oneflow的softmax kernel实现以及Faster Transformer softmax kernel的实现,并以个人的角度分别解析了原理和代码实现,最后对性能做一个对比方便大家直观的感受到onefl…...
python 类对象的析构释放代码演示
文章目录一、类的构造函数与析构函数二、代码演示1. 引用的更迭2. 只在函数内部的类对象三、函数内部返回的类对象1. 使用全局变量 引用 函数内部的类对象一、类的构造函数与析构函数 init 函数是python 类的构造函数,在创建一个类对象的时候,就会自动调…...
Hadoop Shell常用命令
Hadoop Shell命令在管理HDFS的时候还是比较常用的,Hadoop Shell命令与shell命令极为相似,但是方便查询,在这里总结分享,大家enjoy~~ 1,cat 语法格式:hadoop fs -cat URI [URI …] 含义:将路径…...
Android中级——色彩处理和图像处理
色彩处理 通过色彩矩阵处理 色彩矩阵介绍 图像的RGBA可拆分为一个4行5列的矩阵和5行1列矩阵相乘 其中4行5列矩阵即为ColorMatrix,可通过调整ColorMatrix间接调整RGBA 第一行 abcde 决定新的 R第二行 fghij 决定新的 G第三行 klmno 决定新的 G第四行 pqrst 决定新…...
C++类和对象:类的定义、类对象的存储、this指针
目录 一. 对于面向过程和面向对象的认识 二. 类 2.1 struct关键字定义类 2.1.1 C语言中的struct关键字 2.1.2 C中的struct关键字 2.2 class关键字 2.1 使用class关键字定义类 三. 类的访问限定及封装 3.1 类的访问权限及访问限定符 3.1.1 访问权限 3.1.2 访问限定…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
