Java面试题-Spring框架

news2025/7/23 6:48:52

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事务实现方式

  1. 编程式事务

    概念:在业务代码中精确定义事务边界

    代码块中调用:beginTransaction()、commit()、rollback()等相关方法

  2. 声明式事务

    有助于用户将操作与事务规则进行解耦。简单地说,编程式事务侵入到了业务代码里面,但是提供了更加详细的事务管理;而声明式事务由于基于AOP,所以既能起到事务管理的作用,又可以不影响业务代码的具体实现。

​ 使用:

@EnableTransactionManagement:开启事务管理

@Transactional:开启事务

@Transactional事务注解失效原因:

  • 方法修饰符不为public
  • 方法内部调用事务
  • 事务内捕获异常,未抛出新异常
  • rollbackFor属性配置错误

7. Spring事务的底层原理

使用事务步骤:

  • 获取数据库连接
  • 开启事务
  • 执行数据操作
  • 提交事务/回滚事务
  • 关闭连接

Spring在框架中做了开启事务、提交事务、回滚事务的操作,使得业务代码和事务代码解耦。这一功能是基于AOP实现的。

8. 自定义注解实现功能

参考:https://www.jianshu.com/p/7c2948f64b1c

9. SpringMVC运行流程

在这里插入图片描述

核心代码:DispatcherServlet.java -> doDispatch()

  1. 用户请求
  2. DispatcherServlet中央调度器通过请求查找HandlerMapping获取Handler
  3. DispatcherServlet中央调度器通过Handler查找HandlerAdapeter
  4. 处理器适配器调用用户编写的controller,返回ModelAndView(基于JSON交互的,返回ModelAndView为空,此时前端已能接收到返回值)
  5. DispatcherServlet中央调度器通过ModelAndView查找对应ViewResolver,返回View
  6. 渲染View
  7. 返回渲染后的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:单例对象的cache
  • earlySingletonObjects:提前曝光的单例对象的cache
  • singletonFactories:单例对象工厂的cache

12. Spring中使用了哪些设计模式

1、工厂模式:BeanFactory、ApplicationContext

2、单例模式:Bean默认为单例模式

3、代理模式:AOP功能用到了JDK动态代理和Cglib动态代理

4、适配器模式:Spring AOP 的拦截器使用到了适配器模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESMM的理解和高频面试问题

ESMM的理解首先&#xff0c;理解部分主要是ESMM要解决什么问题&#xff0c;以及解决方案。弱未度过原文的可以查阅原论文。论文地址&#xff1a;https://arxiv.org/pdf/1804.07931.pdf实现代码&#xff1a;https://github.com/PaddlePaddle/PaddleRec/tree/master/models/multi…

2023最新谷粒商城笔记之购物车篇(全文总共13万字,超详细)

购物车 环境搭建 创建购物车项目 第一步、创建gulimall-cart服务&#xff0c;并进行降版本处理 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE<…

angular框架表格自定义导出,ui组件库为【devExpress by devExtreme】导出插件为exceljs、file-saver

前言 使用的ui组件库为devExtreme注意&#xff1a;如果你没有使用这个组件库&#xff0c;那后续的代码可能对你不适用&#xff01;&#xff01;&#xff01;&#xff0c;因为devExtreme和exceljs是结合着来的 其地址如下&#xff1a; devexpress https://js.devexpress.com/ …

一文速学-Pandas查询索引操作详解+实例代码展示

目录 前言 一、按列表索引查询 查询单值 1.at(单值查询-loc) 2.iat(单值查询-iloc) 3. loc(行/列名索引查询) 4. iloc(行/列索引查询) 二、按条件查询 单条件查询 多条件查询 嵌套筛选 总结 前言 关于一文速学Pandas系列已经将基础部分内容更完&#xff0c;基础部分的…

ASEMI高压MOS管ASE65R330参数,ASE65R330图片

编辑-Z ASEMI高压MOS管ASE65R330参数&#xff1a; 型号&#xff1a;ASE65R330 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;650V 栅源电压&#xff08;VGS&#xff09;&#xff1a;20V 漏极电流&#xff08;ID&#xff09;&#xff1a;12.5A 功耗&#xff08;P…

[数据结构]:03-栈(C语言实现)

目录 前言 已完成内容 单链表实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-StackCommon.cpp 04-StackFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是为了简…

跨境卖家必看的沃尔玛Walmart商家入驻教程

沃尔玛Walmart作为作为全球连锁超市的鼻祖&#xff0c;有不可比拟的知名度。当沃尔玛从线下延伸到线上后&#xff0c;就成为一个自带IP与流量的线上平台&#xff0c;在全世界都拥有数量庞大的消费者群体。所以龙哥就结合自己注册Walmart的过程给大家详细讲解一下。 Walmart卖家…

365智能云打印怎么样?365小票无线订单打印机好用吗?

365智能云打印怎么样&#xff1f;365智能云打印是有赞官方首推的订单小票打印机&#xff0c;荣获2016年有赞最佳硬件服务商。可以实现远程云打印&#xff0c;无需连接电脑&#xff0c;只需通过GPRS流量或者WIFI即可连接&#xff0c;不受地理位置和距离限制。365小票无线订单打印…

1W+企业都在用的数字化管理秘籍,快收藏!

企业数字化&#xff0c;绕不开的话题。 随着国家相继出台各种举措助力中小企业数字化转型&#xff0c;积极推动产业数字化转型&#xff0c;培育数字经济新生态&#xff0c;企业想要谋生存&#xff0c;求发展&#xff0c;必然需要做好数字化转型和管理。 本篇文章想跟大家一起…

【STM32MP157应用编程】2.GPIO输入、输出、中断

目录 GPIO文件 指令操作GPIO 程序操作GPIO 程序说明 程序代码 2_GPIO_4.c 启动交叉编译工具 编译 拷贝到开发板 测试 GPIO文件 在/sys/class/gpio目录下&#xff0c;存放了GPIO的文件。 gpiochipX&#xff1a;当前SoC所包含的GPIO控制器&#xff0c;STM32MP157一共包…

新型开源C2框架:浩劫

研究人员发现了一次针对政府实体的新攻击&#xff0c;攻击者在此期间使用了一种名为浩劫&#xff08;Havoc &#xff09;的新型 C2 框架。 尽管 C2 框架广泛可用&#xff0c;但 Havoc 作为一种先进的后开发框架脱颖而出&#xff0c;可以躲避最新版本的 Windows 11 Defender。 …

一文带你快速初步了解云计算与大数据

目录 &#x1f50d;一、云计算基础 1、云计算的概念、特点、关键技术 2、云计算的分类 3、云计算的部署模式 4、云计算的服务模式&#xff1a;IaaS、PaaS、SaaS分别是什么&#xff0c;具体含义要清楚 5、物联网的概念 6、物联网和云计算、大数据的关系 7、了解云计算的…

Python-生成元组和字典

1.生成元组元组是元素按顺序组合后的产物&#xff0c;元组对象的类型是tuple型含有两个元素的元组成为数据对元组可以包含任意数量和任意类型的元素&#xff0c;其元素总数可以为0、1、2等&#xff0c;并且元素的先后顺序是由意义的。另外&#xff0c;元组中的元素类型没有必要…

open3d最大平面检测,平面分割

1.点云读入 读入文件&#xff08;配套点云下载链接&#xff09; # 读取点云 pcd o3d.io.read_point_cloud("point_cloud_00000.ply")配套点云颜色为白色&#xff0c;open3d的点云显示默认背景为白色&#xff0c;所以将点云颜色更改为黑色 pcd.colors o3d.utilit…

利用 OLE 对象漏洞的 HWP 恶意文件浮出水面

ASEC 分析人员发现了一个利用 OLE 对象的恶意 HWP 文件&#xff0c;尽管其使用了 2020 年就被识别的恶意 URL&#xff0c;但仍然使用了 Flash 漏洞&#xff08;CVE-2018-15982&#xff09;&#xff0c;需要用户谨慎对待。 打开 HWP 文件时会在 %TEMP%文件夹中生成如下文件。攻…

数据结构之基:从根儿上了解数据结构的特性

学好数据结构&#xff0c;就等于成功了一半。 程序是对现实的模拟&#xff0c;现实是由时间和空间组成的&#xff0c;高效的人都是用最少的时间、最少的空间来做最伟大的事&#xff0c;程序亦是如此。我们要选择最合理的算法和最合理的数据结构&#xff0c;来写最好的代码&…

MySQL进阶知识

1 存储引擎1.1 MySQL体系结构1.2 存储引擎简介存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;同一个库的多个表可以采用不同的存储引擎&#xff0c;所以存储引擎也经常称为表类型。创建表时可以指…

Rocketmq源码(一)手把手本地调试

很久没有学习了&#xff0c;从前是因为太忙&#xff0c;现在是因为太懒。立个flag&#xff0c;一定要把rocketmq源码看完&#xff01;源码阅读从idea的环境搭建和debug开始&#xff5e; Idea搭建调试目录代码下载代码架构启动namesvr启动broker启动consumer启动producer代码下载…

深度学习训练营之yolov5 官方代码调用以及-requirements.txt下载当中遇到的问题

深度学习训练营之yolov5 官方代码调用原文链接内容总结环境介绍前置工作简单介绍yolov5下载源码yolov5的下载遇到问题问题解析问题处理创建虚拟环境下载当中遇到的问题代码运行视频检测参考内容原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

taobao.trades.sold.query( 根据收件人信息查询交易单号 )

&#xffe5;开放平台免费API必须用户授权聚石塔内调用 根据收件人信息查询交易单号。 公共参数 请求地址: HTTP地址 公共请求参数: 公共响应参数: 请求参数 请求示例 TaobaoClient client new DefaultTaobaoClient(url, appkey, secret); TradesSoldQueryRequest req new…