Spring源码面试题

news2024/11/14 3:08:08

Spring源码面试题

谈谈你对Spring框架的理解?

Spring 是一个开源的应用程序框架,它起源于 Rod Johnson 在其著名的 Spring Framework 专著中提出的一个轻量级框架的观念。下面是 Spring 的发展历史:

  1. 2002 年,Rod Johnson 发表了他的专著 “Expert One-On-One J2EE Design and Development”,提出了 Spring 框架的思想。
  2. 2003 年,Johnson 和一些开发者创建了 Spring Framework 项目,并在 SourceForge 上发布了第一个版本。
  3. 2004 年,Spring Framework 1.0 版本发布,包括核心容器、AOP 模块、DAO 模块、JDBC 模块和 Web 模块等组成部分。
  4. 2006 年,Spring Framework 2.0 版本发布,增加了对注解的支持、Web Services 支持、异步执行能力等新特性。
  5. 2009 年,Spring Framework 3.0 版本发布,引入了对 Java 5、Java 6 特性的支持,包括泛型、注解、并发等。
  6. 2013 年,Spring Framework 4.0 版本发布,提供对 Java 8 的支持,包括 lambda 表达式、Stream API 等。
  7. 2015 年,Spring Framework 4.2 版本发布,增加了对 WebSocket 和 STOMP 协议的支持。
  8. 2017 年,Spring Framework 5.0 版本发布,对响应式编程提供了支持,并对代码库进行了大规模升级和剪裁,去掉了过时和不必要的模块和类。

自从 2003 年发布以来,Spring Framework 在 Java 开发社区中变得越来越流行,并成为了多个企业级应用开发的首选框架之一。

image.png

Spring Framework的IoC容器实现原理是什么?

  1. 控制翻转
  2. Spring中IoC的实现:管理Bean对象的容器 ==》 容器是如何管理Bean对象 ==》 容器创建添加Bean对象 ==》Bean的定义。Bean定义的管理。Bean的声明周期

Bean的定义==》 BeanDefinition 》 BeanFactory【存储了所有的BeanDefinition】》BeanDefinitionRegistry 》 Bean实例有两种类型 单例,原型 单例》容器初始化的时候==》完成对应的实例。单例Bean保存在一级缓存中。 原型Bean 在我们获取Bean的时候getBean()会完成对象的实例化

  Spring的IoC(Inversion of Control,控制反转)是一种设计模式,它的核心思想是将对象的创建、组装和管理过程交给框架来完成,而不是由应用程序直接控制。这种模式通过将应用程序的控制权交给框架来提高应用程序的可扩展性、灵活性和可维护性。

  在Spring中,IoC容器负责管理和组装应用程序中的组件。IoC容器可以通过XML配置文件、Java注解和Java代码来配置和组装对象。Spring IoC容器的实现类包括BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,提供了更多的功能和便利的特性。

  在源码层面,Spring IoC的核心组件是BeanFactory和BeanDefinition。BeanFactory是IoC容器的接口,它提供了管理和获取bean的方法。BeanDefinition是描述bean的元数据对象,包括bean的类型、作用域、依赖项和初始化参数等信息。BeanFactory通过BeanDefinition来创建、组装和管理bean。

  在Spring中,BeanFactory和ApplicationContext之间的区别在于ApplicationContext在BeanFactory的基础上提供了更多的特性,例如国际化、事件机制、AOP和自动装配等功能。此外,ApplicationContext还可以管理生命周期和资源,提供了更方便的方法来管理Spring应用程序。

  在源码中,Spring IoC通过使用反射、动态代理和BeanPostProcessor等技术来实现依赖注入和组件的创建和管理。在创建bean时,IoC容器会解析BeanDefinition,然后通过反射创建bean实例,设置bean的属性并执行初始化方法。对于需要注入其他bean的属性,容器会自动查找相应的bean实例并进行注入。在完成bean的创建和依赖注入后,容器将bean放入自己的容器中进行管理,同时可以根据需要进行销毁或重置。

Spring Framework的Bean生命周期是怎样的?

Spring的Bean的生命周期

Servlet的生命周期

Filter的生命周期

Vue 生命周期

image.png

image.png

Spring Framework AOP的实现原理是什么?

AOP:面向切面编程 补充》OOP:面向对象编程

1。你们公司中对AOP的应用

2。在Spring中AOP的使用方式

3。AOP中的核心概念

4。SpringAOP的实现

核心概念讲解:

image.png

image.png

Spring Framework事务管理的实现原理是什么?

1。事务特性–》 事务的传播属性和事务的隔离级别 serviceA 事务管理a(){serviceB.b()} serviceB b();

serviceA a(){proxy.b();} b()

2。Spring中的事务的设计

3。基于AOP的事务实现

image.png

image.png

Spring Framework的事件机制是怎样的?

1.设计模式:发布订阅模式【观察者模式】

2。事件涉及到的核心概念:

  Spring中的事件机制是基于观察者设计模式的实现。它包含三个核心组件:事件、事件监听器和事件发布器。

  在Spring中,事件是一个普通的Java对象,通过继承 ApplicationEvent类来实现,它可以包含任意的数据。事件监听器是一个接口,只有一个方法 onApplicationEvent(),用来处理事件。事件发布器是 ApplicationEventPublisher接口的实现类,用来发布事件。

  当一个事件发布器发布一个事件时,它会通知所有注册了对应事件类型的监听器。监听器会按照注册的顺序一次处理事件。如果事件处理抛出了异常,发布器会捕获并打印异常信息。

  Spring事件机制的优点在于它可以实现模块之间的解耦合,一个模块只需要发布事件,而不需要知道哪些其他模块会对此事件进行处理。同时,使用Spring事件机制也可以实现事务的控制,例如在事件处理方法上添加 @Transactional注解,就可以保证整个事件在一个事务中执行。

Spring Framework中常用的设计模式有哪些?

Spring框架是一个基于多种设计模式的框架,以下是Spring中常用的几种设计模式:

  1. 依赖注入(Dependency Injection):也称为控制反转(Inversion of Control),通过控制反转,将对象的创建和依赖关系的管理交给Spring容器来处理,实现松散耦合和易于测试的目标。
  2. AOP(Aspect-Oriented Programming):面向切面编程,通过将横切关注点(如事务、安全、日志等)抽取出来,与业务代码分离,实现模块化开发、代码复用,提高系统的可维护性和可扩展性。
  3. 工厂模式(Factory Pattern):通过抽象工厂接口来统一管理对象的创建,增加新的实现类时不需要修改已有代码,只需要添加新的实现类,符合开闭原则。
  4. 单例模式(Singleton Pattern):通过单例模式确保一个类只有一个对象,提高系统性能和资源使用效率。
  5. 模板方法模式(Template Method Pattern):将一个操作中的算法框架固定,将具体实现延迟到子类中,实现了代码复用和扩展的目标。
  6. 观察者模式(Observer Pattern):定义一种一对多的关系,当一个对象的状态发生改变时,通知其他对象更新自己的状态,常用于事件处理等场景中。

通过以上常用的设计模式,Spring框架实现了松散耦合、面向切面、工厂化、可扩展、易于测试等优秀的特性,提高了系统的可维护性和可扩展性。

Spring Framework中常用的注解有哪些?

Spring框架中常用的注解有:

  1. @Autowired:自动装配,将需要的依赖注入到类中。通过使用不同的方式注入(如构造器注入、Setter注入、字段注入等)来指定要注入的实例对象。
  2. @Component:声明一个组件,将会由Spring框架进行扫描,并将其实例化作为一个Bean纳入Spring容器管理。
  3. @Controller:声明一个MVC控制器,标记该类为Spring的控制器,处理Web请求。
  4. @Service:声明一个服务类,标记该类为Spring的服务类,用于处理业务逻辑。
  5. @Repository:声明一个数据访问类,标记该类为Spring的数据访问类,用于进行数据库操作。
  6. @Configuration:声明一个Java配置类,其内部包含了若干个@Bean注解用于声明Bean对象。
  7. @Bean:声明一个Bean,用于在Java配置类中定义需要注入IOC容器中的Bean实例对象。
  8. @RequestMapping:用于将HTTP请求映射到对应的控制器中的处理方法上。
  9. @Value:用于将配置文件中的属性值注入到Spring Bean中的字段属性中。

以上是Spring框架中常用的注解,可以帮助开发者快速实现依赖注入、Bean管理、Spring MVC等功能。

Spring Framework中如何处理循环依赖问题?

1。什么是循环依赖 A–》 B B–》 A

构造注入:是解决不了循环依赖的

设值注入:是可以解决循环依赖的–》 提前暴露

2。Spring中的循环依赖是怎么处理?

三级缓存

3。为什么要三级缓存?

如果没有代理对象。二级缓存是足够的

二级缓存提前暴露的是 Bean的真实对象。但是后面我们返回的其实是代理对象

4。为什么Spring没有使用二级缓存来解决。

5。Spring中一级缓存能处理循环依赖吗?

Spring中一级缓存存储的是单例bean

6。Spring支持对原型对象的循环依赖的支持吗?

原型对象==》有很多个。那么我就需要缓存 原型对象。

Spring容器支持处理循环依赖,即A对象依赖了B对象,而B对象又依赖了A对象的情况。

当Spring容器在创建一个Bean实例时,会记录该Bean实例的创建过程,当发生了循环依赖时,Spring会将该Bean实例的先前创建请求暂存到一个“早期引用”中,这时Spring容器并未将完全构造的Bean实例提供给请求它的对象,而是返回一个代理对象,等到该Bean实例构造完成后,将“早期引用”中的Bean实例注入到对应的属性中。

要注意的是,Spring只能处理单例模式下的循环依赖,因为每个单例Bean在Spring容器只会被创建一次,而在原型模式下,每次请求新的Bean实例时,Spring容器都会进行一次完整的Bean实例化过程,这样循环依赖就不存在了。

当存在循环依赖时,Spring容器会抛出BeanCurrentlyInCreationException异常,表明当前Bean正在创建中,此时可以通过调整Bean的依赖关系,或使用构造器注入等方式解决循环依赖问题。

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

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

相关文章

GPT Prompt编写的艺术:如何提高AI模型的表现力

随着AI技术的迅速发展,人工智能模型变得越来越强大,能够协助我们完成各种任务。然而,如何更好地利用AI的能力仍然存在很大的探索空间。在与AI进行交互的过程中,我们主要依赖于Prompt,不管是直接与大模型交互&#xff0…

dlib的安装

由于需要人脸识别,所以需要安装opencv和dlib,OpenCV的安装很顺利,实例也跑的很正常。但dlib的安装却出现了很多坑,而且国内的解决方法都是复制粘贴,一点营养都没有,查了国外资料,终于解决&#…

让Python点亮你的世界:打造专业级编程环境的必备步骤

文章目录 初识pythonpython的安装win系统Linux系统(centos7) 第一个Python程序常见问题 Python解释器Python开发环境PyCharm的基础使用创建项目修改主题修改默认字体和大小汉化插件翻译软件常用快捷键 初识python Python语言的起源可以追溯到1989年&…

OFCMS代码审计

环境搭建 https://blog.csdn.net/oufua/article/details/82584637 安装后是重启容器 最后 db-config.properties 改成db.properties 修改数据库连接 搭建成功 代码审计 sql注入审计 全局搜索${ 查看没有预编译的sql语句,从而找到sql注入功能点 Ctrlalth 查看函…

AIGC大模型ChatGLM2-6B:国产版chatgpt本地部署及体验

1 ChatGLM2-6B介绍 ChatGLM是清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。ChatGLM基于GLM130B千亿基础模型训练,它具备多领域知识、代码能力、常识推理及运用能力;支持与用户通过自然语言对话进行交互,处理多种自然语言任务…

干翻Dubbo系列第八篇:Dubbo直连开发核心三要素概述

文章目录 文章说明 一:Dubbo直连开发概念 1:直连设计中的核心组件 (一):Provider服务的提供者 (二): Consumer服务的访问者 (三):网络通信明白图 文章说明 本文内容整理自《孙哥说Dubbo系列视频课程》,孙帅老师…

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件

❤ npm不是内部或外部命令,也不是可运行的程序 或批处理文件 cmd或者终端用nvm 安装提示: npm不是内部或外部命令,也不是可运行的程序或批处理文件 原因(一) 提示这个问题,有可能是Node没有安装,也有可能是没有配置…

【LeetCode】105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 这道题也是经典的数据结构题了,有时候面试题也会遇到,已知前序与中序的遍历序列,由前序遍历我们可以知道第一个元素就是根节点,而中序遍历的特点就是根节点的左边全部为左子树,右…

C高级-day2

思维导图 #!/bin/bash echo "$(head -n 5 /etc/group | tail -1)" mkdir /home/ubuntu/copy cd /home/ubuntu/copy cp /etc/shadow test chown root test chmod o-r,o-w,o-x test#include <myhead.h> //递归实现&#xff0c;输入一个数&#xff0c;输出这个数的…

OpenShift 4 - 可观测性之用 OpenTelemetry+Tempo 实现 Distributed Tracing

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.13 的环境中验证 文章目录 技术架构部署 Distributed Tracing 运行环境安装 minio 环境安装 Grafana Tempo 环境 部署测试应用并进行观测跟踪测试应用1测试应用2 参考 技术架构 Tempo …

Vue3 watch监听器

概览&#xff1a;watch监听器的定义以及使用场景。在vue3中的监听器的使用方式&#xff0c;watch的三个参数&#xff0c;以及进一步了解第一个参数可以是一个属性&#xff0c;也可以是一个数组的形式包含多个属性。 watch在vue3和vue2中的使用&#xff1a; vue3中&#xff1a…

互联网+同城上门预约推拿系统-到家理疗服务平台源码

随着互联网技术的不断发展&#xff0c;越来越多的传统行业开始拥抱互联网&#xff0c;实现线上线下融合。推拿按摩作为人们日常保健、治疗疾病的一种方式&#xff0c;也在不断探索与互联网的结合。 本文将介绍基于互联网思维的家庭同城预约推拿系统到家服务平台的源码如何实现…

k8s pod数据存储Volumes

一、说在前面的话 在 Kubernetes 的 Deployment 中&#xff0c;您可以使用多种类型的 Volumes 来管理 Pod 中的数据。 作用是用来共享目录及配置&#xff0c;不用在每个pod里进行配置。 本文主要概述怎么使用HostPath、PersistentVolumeClaim、ConfigMap。 二、k8s有哪些Vol…

嵌入式入门教学——C51

一、前期准备 1、硬件设备 2、软件设备 二、预备知识 1、什么是单片机&#xff1f; 在一片集成电路芯片上集成微处理器、存储器、IO接口电路&#xff0c;从而构成了单芯片微型计算机&#xff0c;及单片机。STC89C52单片机&#xff1a; STC&#xff1a;公司89&#xff1a;所属…

基于图片、无人机、摄像头拍摄进行智能检测功能

根据要求进行无人机拍摄的视频或图片进行智能识别&#xff0c;开发过程需要事项 1、根据图片案例进行标记&#xff0c;进行模型训练 2、视频模型训练 开发语言为python 根据需求功能进行测试结果如下 根据车辆识别标记进行的测试结果截图 测经过查看视频 8月1日

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现

深度学习论文: RepViT: Revisiting Mobile CNN From ViT Perspective及其PyTorch实现 RepViT: Revisiting Mobile CNN From ViT Perspective PDF: https://arxiv.org/pdf/2307.09283.pdf PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: https://gith…

DSP学习笔记

间接寻址&#xff08;通过放在辅助寄存器里面&#xff0c;可以对地址包括很多操作&#xff0c;1&#xff0c;-1&#xff0c;/-平移量&#xff0c;辅助寄存器内容的修改是在ARAU0和ARAU1中完成的。分为单操作数和双操作数&#xff0c;有很多模式在ARAU。单操作数间接寻址&#x…

[PyTorch][chapter 46][LSTM -1]

前言&#xff1a; 长短期记忆网络&#xff08;LSTM&#xff0c;Long Short-Term Memory&#xff09;是一种时间循环神经网络&#xff0c;是为了解决一般的RNN&#xff08;循环神经网络&#xff09;存在的长期依赖问题而专门设计出来的。 目录&#xff1a; 背景简介 LSTM C…

dubbo的高可用

1、zookeeper宕机与dubbo直连 现象&#xff1a;zookeeper注册中心宕机&#xff0c;还可以消费dubbo暴露的服务。 原因&#xff1a; 健壮性 &#xff08;1&#xff09;监控中心宕掉不影响使用&#xff0c;只是丢失部分采样数据. &#xff08;2&#xff09;数据库宕掉后&#x…

三、线性工作流

再生产的各个环节&#xff0c;正确使用gamma编码及gamma解码&#xff0c;使得最终得到的颜色数据与最初输入的物理数据一致。如果使用gamma空间的贴图&#xff0c;在传给着色器前需要从gamma空间转到线性空间。 如果不在线性空间下进行渲染&#xff0c;会产生的问题&#xff1a…