Spring源码面试题

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.mzph.cn/news/19871.shtml

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

相关文章

RISC-V 指令集介绍

1. 背景介绍 指令集从本质上可以分为复杂指令集(Complex Instruction Set Computer,CISC)和精简指令集(Reduced Instruction Set Computer,RISC)两种。复杂指令集的特点是能够在一条指令内完成很多事情。 指…

云安全攻防(四)之 云原生技术

云原生技术 容器技术 容器与虚拟化 虚拟化(Virtualization)和容器(Container)都是系统虚拟化的实现技术,可实现系统资源的”一虚多“共享。容器技术可以理解成一种”轻量的虚拟化“方式,此处的”轻量“主…

安全加固服务器

根据以下的内容来加固一台Linux服务器的安全。 首先是限制连续密码错误的登录次数,由于RHEL8之后都不再使用pam_tally.so和pam_tally2.so,而是pam_faillock.so 首先进入/usr/lib64/security/中查看有什么模块,确认有pam_faillock.so 因为只…

UG\NX 二次开发 相切面、相邻面的选择控件

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 有群友问“UFUN多选功能过滤面不能选择相切面或相邻面之类的吗?” 这个用Block UI的"面收集器"就可以,ufun函数是不行的。 效果&am…

Debeizum 增量快照

在Debeizum1.6版本发布之后,成功推出了Incremental Snapshot(增量快照)的功能,同时取代了原有的实验性的Parallel Snapshot(并行快照)。在本篇博客中,我将介绍全新快照方式的原理,以…

HTML+CSS+JavaScript:实现B站评论发布效果

一、需求 1、用户输入内容,输入框左下角实时显示输入字数 2、为避免用户输入时在内容左右两端误按多余的空格,在发送评论时,检测用户输入的内容左右两端是否带有空格,若有空格,发布时自动取消左右两端的空格 3、若用…

浏览器的同源策略 - 跨域问题

1.什么是跨域 跨域问题的实质是浏览器的同源策略造成的。浏览器同源策略是浏览器为 JavaScript 施加的限制。简单点说就是非同源会出现如下等限制: 无法访问其他源下的网页的 Cookies,Storage等;无法访问其他源下的DOM对象和 JS 对象;无法使…

java环境搭建 Ubuntu Linux

jdk的安装和配置环境变量 使用apt sudo apt install default-jdk若是安装成功了在终端输入java -version来查看是否安装成功 使用官网下载的jdk包 直接在百度上搜索jdk,选择图片这个 网址:jdk下载网址 若是arm就选择带有arm的,反之选择x64的&#…

vscode 通过mongoose 连接mongodb atlas

了解mongodb 的项目结构 1.代表集群名称 > 2.代表数据库名称>3.代表每个 collection名称 三者范围为从大到小的关系 (一对多)。每个集群有不同的连接地址、用户信息(Database Access)、ip配置信息(Network Acce…

51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验一 点亮第一个LED

目录 前言 一、原理图及知识点介绍 1.1、LED原理图 1.2、MCU51原理图 二、代码分析 知识点一:#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 知识点二:你知道sfr P0 0x80;是怎么来的呢为什么要赋值0x80&#xff…

vxworks文件系统分析

参考https://www.freebuf.com/articles/endpoint/335030.html 测试固件 https://service.tp-link.com.cn/detail_download_7989.html 固件提取 binwalk解压固件,在第一部分即为要分析的二进制文件,可以拖进ida分析 设置为arm小端字节序,点…

数组中出现次数超过一半的数字——剑指 Offer 39

文章目录 题目描述法一 哈希表法二 摩尔投票 题目描述 法一 哈希表 使用哈希映射(HashMap)来存储每个元素以及出现的次数。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。 class Solution { public:int maj…

程序的编译和调试

gcc编译器 gcc(GNU Compiler Collection)是GNU推出的多平台编译器,可将C、C源程序编译连接成可执行文件,支持以下后缀: .c c语言源代码 .h 程序所包含的头文件 .i 已经预处理过的C源代码文件 .s 汇编语言源代码文件 .o 编译后的目标文件…

解决SVN或GIT忽略提交文件的问题

背景 使用IDEA 的SVN插件提交文件是总是会提交一些不需要提交的文件; 我们可以通过一些简单设置忽略这些文件。 git 在项目根目录新建文本文件,修改后缀为.gitignore 文件中添加内容 *.iml .project .gradle/ .idea/ target/ build/ .vscode/ .settings/ .facto…

Elasticsearch:语义搜索 - Semantic Search in python

当 OpenAI 于 2022 年 11 月发布 ChatGPT 时,引发了人们对人工智能和机器学习的新一波兴趣。 尽管必要的技术创新已经出现了近十年,而且基本原理的历史甚至更早,但这种巨大的转变引发了各种发展的“寒武纪大爆炸”,特别是在大型语…

SAP数据库表维护视图生成器的使用

在SAP中,经常需要自定义数据库表。而且可能需要人工维护数据库表中的数据,可以通过SM30进行维护数据;但是SM30事务的权限太大,不适宜将SM30直接分配;因此,可以通过给维护表分配事务代码,来达到控…

无涯教程-Perl - 环境配置

在开始编写Perl程序之前,让我们了解如何设置我们的Perl环境。 您的系统更有可能安装了perl。只需尝试在$提示符下给出以下命令- $perl -v 如果您的计算机上安装了perl,那么您将收到以下消息: This is perl 5, version 16, subversion 2 (v5.16.2) b…

MySQL数据库——DQL操作——基本查询

文章目录 前言事前准备——测试数据整表查询指定列查找别名查询MySQL运算符条件查询模糊查询排序查询聚合查询分组查询分组之后的条件筛选 分页查询将整张表的数据插入到另一张表中 前言 MySQL数据库常见的操作是增删查改,而其中数据的查询是使用最多,也…

Modbus TCP转Profinet网关modbus tcp转以太网

大家好,今天我们来聊一聊如何使用捷米特的Profinet转modbusTCP协议转换网关在博图上进行非透传型配置。 1, 首先,我们需要安装捷米特JM-TCP-PN的GSD文件,并根据现场设备情况配置modbusTCP地址。然后,在博图中添加该GSD文件&#x…

了解垃圾回收算法

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 垃圾回收(Garbage Collect)是Java语言中的一种自动内存管理机制,用于自动回收不再使用的对象所占用的内存空间。Java虚拟机会自动追踪和…