掌握 Spring:从新手到高手的常见问题汇总

news2024/11/18 3:59:41

一提起Spring,总感觉有太多知识,无法详尽,有些基础理解就先不说了,相信大家都已经用过Spring了
下面简单针对常见Spring面试题做些回答

核心特性

  • IOC容器
  • spring事件
  • 资源管理
  • 国际化
  • 校验
  • 数据绑定
  • 类型转换
  • spirng表达式
  • 面向切面编程
  • ……

SpringMVC流程

1、 用户发送请求至前端控制器DispatcherServlet。

2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、 DispatcherServlet调用HandlerAdapter处理器适配器。

5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。

6、 Controller执行完成返回ModelAndView。

7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

9、 ViewReslover解析后返回具体View。

10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

11、 DispatcherServlet响应用户。

实例化Bean的方法initializeBean,该方法在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory类下

Bean生命周期

  1. Spring 容器根据配置中的 bean 定义 实例化 bean。

  2. Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。

  3. invokeAwareMethods:如果 bean 实现BeanNameAware 接口,则工厂通过传递 bean 的 ID 来调用setBeanName()。如果bean实现BeanClassLoaderAware,则调用setBeanClassLoader()

  4. 如果 bean 实现 BeanFactoryAware 接口,工厂通过传递自身的实例来调用 setBeanFactory()。

  5. 如果存在与 bean 关联的任何BeanPostProcessors,则调用 preProcessBeforeInitialization() 方法

  6. 如果为 bean 指定了 init 方法( 的 init-method 属性),那么将调用它。

  7. 最后,如果存在与 bean 关联的任何 BeanPostProcessors,则将调用 postProcessAfterInitialization() 方法

  8. 如果 bean 实现DisposableBean 接口,当 spring 容器关闭时,会调用 destory()。

  9. 如果为bean 指定了 destroy 方法( 的 destroy-method 属性),那么将调用它。

在这里插入图片描述

SPI机制

基于接口的编程+策略模式+配置文件

在Springboot的自动装配过程中,最终会加载META-INF/spring.factories文件,而加载的过程是由SpringFactoriesLoader加载的。从CLASSPATH下的每个jar包中搜索所有META-INF/spring.factories

配置文件,其实这里不仅仅是去ClassPath路径下查询,而是会扫描所有路径下的jar包,只不过这个文件只会在ClassPath下的jar包中.

public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
// spring.factories文件的格式为:key=value1,value2,value3
// 从所有的jar包中找到META-INF/spring.factories文件
// 然后从文件中解析出key=factoryClass类名称的所有value值
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
    String factoryClassName = factoryClass.getName();
    // 取得资源文件的URL
    Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
    List<String> result = new ArrayList<String>();
    // 遍历所有的URL
    while (urls.hasMoreElements()) {
        URL url = urls.nextElement();
        // 根据资源文件URL解析properties文件,得到对应的一组@Configuration类
        Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
        String factoryClassNames = properties.getProperty(factoryClassName);
        // 组装数据,并返回
        result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
    }
    return result;
}

Bean循环依赖如何解决的

先调用构造函数进行实例化,然后填充属性,再接着进行其他附加操作和初始化,正是这样的生命周期,才有了Spring的解决循环依赖,这样的解决机制是根据Spring框架内定义的三级缓存来实现的,也就是说:三级缓存解决了Bean之间的循环依赖

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

找出了前面提到的三级缓存,也就是三个Map集合类:

singletonObjects:第一级缓存,用于保存实例化、注入、初始化完成的bean实例

earlySingletonObjects:第二级缓存,用于保存实例化完成的bean实例(未注入和初始化)

singletonFactories:第三级缓存,用于保存bean创建工厂,以便于后面扩展有机会创建代理对象。属于提前暴露

后面专门针对这块分析下源码,下面是调用初始化的详细步骤示例

在这里插入图片描述

  1. 创建对象A,实例化的时候把A对象工厂放入三级缓存
  2. A注入属性时,发现依赖B,转而去实例化B
  3. 同样创建对象B,注入属性时发现依赖A,一次从一级到三级缓存查询A,从三级缓存通过对象工厂拿到A,把A放入二级缓存,同时删除三级缓存中的A,此时,B已经实例化并且初始化完成,把B放入一级缓存
  4. 接着继续创建A,顺利从一级缓存拿到实例化且初始化完成的B对象,A对象创建也完成,删除二级缓存中的A,同时把A放入一级缓存
  5. 最后,一级缓存中保存着实例化、初始化都完成的A、B对象

解释 Spring 支持的几种 bean 的作用域。

Spring 框架支持以下五种 bean 的作用域:

  • singleton : bean 在每个 Spring ioc 容器中只有一个实例。
  • prototype:一个 bean 的定义可以有多个实例。
  • request:每次 http 请求都会创建一个 bean,该作用域仅在基于 web的 Spring ApplicationContext 情形下有效。
  • session:在一个 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。
  • global-session:在一个全局的 HTTP Session 中,一个 bean 定义对应一个实例。该作用域仅在基于 web 的 Spring ApplicationContext 情形下有效。缺省的 Spring bean 的作用域是 Singleton.

BeanFactory 和 ApplicationContext 的区别

BeanFactoryApplicationContext 都是 Spring 框架提供的 IOC 容器,分别代表了基础的 IOC 容器和高级的 IOC 容器。ApplicationContextBeanFactory 的子接口,继承了 BeanFactory 的所有功能,并在此基础上提供了更多扩展性的服务。

二、BeanFactory

  • 基本概念BeanFactory 是 Spring 框架中最基础的 IOC 容器,它负责读取 bean 配置文档,管理 bean 的加载与实例化,并控制 bean 的生命周期及维护 bean 间的依赖关系。
  • 加载机制BeanFactory 采用延迟加载机制,即在真正使用某个 bean 时(通过 getBean() 方法调用)才会对其进行加载和实例化。
  • 创建方式BeanFactory 通常通过编程方式创建。

三、ApplicationContext

  • 高级特性ApplicationContextBeanFactory 的基础上增加了许多高级功能,例如国际化支持、资源文件访问、事件发布机制等。
  • 加载机制ApplicationContext 在容器启动时,会一次性创建所有非懒加载的 bean。
  • 创建方式:除了支持编程式创建之外,ApplicationContext 还支持声明式创建。
  • 扩展功能
    • 继承 MessageSource 接口,支持国际化。
    • 提供统一的资源文件访问方式。
    • 支持在监听器中注册 bean 的事件。
    • 允许同时加载多个配置文件。
    • 能够载入具有继承关系的多个上下文,使每个上下文专注于特定的层次(如 Web 层)。
      四、BeanPostProcessor 和 BeanFactoryPostProcessor 的使用
  • BeanFactory 需要手动注册 BeanPostProcessorBeanFactoryPostProcessor
  • ApplicationContext 则自动注册 BeanPostProcessorBeanFactoryPostProcessor

框架中都用到了哪些设计模式?

  1. 工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;

  2. 单例模式:Bean默认为单例模式。

  3. 代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;

  4. 模板方法:用来解决代码重复的问题。比如.JdbcTemplate

  5. 观察者模式:ApplicationListener。

  6. 适配器模式:Aop中,使用Advice(通知)来增强被代理类的功能

使用@Autowired 注解自动装配的过程是怎样的?

使用@Autowired 注解来自动装配指定的 bean。在使用@Autowired 注解之前需要在 Spring 配置文件进行配置。

在启动 spring IoC 时,容器自动装载了一个 AutowiredAnnotationBeanPostProcessor 后置处理器,

当容器扫描到@Autowied、@Resource 或@Inject 时,就会在 IoC 容器自动查找需要的 bean,并装配给该对象的属性。在使用@Autowired 时,首先在容器中查询对应类型的 bean:

• 如果查询结果刚好为一个,就将该 bean 装配给@Autowired 指定的数据;

• 如果查询的结果不止一个,那么@Autowired 会根据名称来查找;

• 如果上述查找的结果为空,那么会抛出异常。解决方法时,使用 required=false。

后面看看会针对一些比较常见重要的问题进行更新,今天就到这,总结总结,希望大家一起成长

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

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

相关文章

视频监控基础学习

IPC&#xff1a;网络摄像机 NVR&#xff1a;网络硬盘录像机产品&#xff0c;搭配IPC使用。集成存储、解码显示、拼接控制、智能分析等多种功能于一体。一机多用&#xff0c;部署简单&#xff0c;功能齐全。安全可靠&#xff0c;适用于各类场景。 ONVIF协议&#xff1a;网络摄像…

数据集 wider_face 人脸数据集 人脸检测 >> DataBall

数据集 wider 人脸检测数据集 WIDER FACE: A Face Detection Benchmark inproceedings{yang2016wider, Author {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou}, Booktitle {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, Title…

巴西电商市场规模、前景及支付方式(pix、Boleto)

一、巴西电商市场分析 作为拉丁美洲最大经济体&#xff0c;巴西在拉丁美洲经济中占据领先地位&#xff0c;根据巴西地理与统计研究所(IBGE)的数据&#xff0c;2023年巴西GDP达到2.2万亿美元&#xff0c;跃居世界第九大经济体。数字化进程以及经济多元化推进正在推动该国中产阶…

基于SpringBoot+Vue的高校教材订购管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

jmeter吞吐量控制器

一、吞吐量控制器作用&#xff1a;旨在混合场景中&#xff0c;控制样本数&#xff0c;通常在比例场景中使用 吞吐量控制器提供了两种控制模式&#xff1a; 百分比执行&#xff08;Percent Executions&#xff09;&#xff1a; 吞吐量控制器会根据配置的百分比来决定其下的作用…

快速完成论文初稿写作的ChatGPT提示词分享

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 随着人工智能技术的迅速发展&#xff0c;ChatGPT已经成为学术写作中不可忽视的工具。它不仅能帮助研究者提高写作效率&#xff0c;还能在初稿撰写过程中提供结构化的建议和内容生成支持…

xshell密钥方式连接阿里云Linux

前提条件 有阿里云ECS linux实例安装好xshell工具 步骤 创建密钥对并绑定ECS实例 浏览器登录阿里云-->控制台-->ECS服务器-->网络与安全-->密钥对-->创建密钥对 根据提示填写密钥名称-->选中默认资源组-->创建 创建完成&#xff0c;会自动下载密钥对的…

看Threejs好玩示例,学习创新与技术(二)

本文接上篇内容&#xff0c;继续挖掘应用ThreeJS的一些创新算法。 本文理解难度比较大&#xff0c;可以先看一些概念&#xff0c;在难的地方培养一些意识即可。 1、扭曲的自然 下面图本身是矩形的&#xff0c;为何它可以这么扭曲呢&#xff1f;它在随机处带有一定的规律&…

多米优选APP源码系统开发

多米优选是一种基于卷轴模式的电商平台系统&#xff0c;它通过滚动展示商品信息&#xff0c;让用户在浏览商品的同时参与各种任务获得奖励&#xff0c;从而提升用户的活跃度和购买意愿。以下是多米优选卷轴模式系统开发的深度解析。 一、系统概述 多米优选卷轴模式源码系统旨在…

高精度治具加工的重要性和优势

在现代工业制造中&#xff0c;高精度治具加工扮演着举足轻重的角色。它不仅关乎产品制造的精度与质量&#xff0c;还直接影响到生产效率和成本控制。因此&#xff0c;时利和将深入探讨高精度治具加工的重要性和优势&#xff0c;对于提升工业制造水平具有重要意义。 高精度治具加…

以系统工程为指导的军品设计、开发与管理常用方法培训

课程背景&#xff1a; 产品开发和产品管理是组织经营战略的核心&#xff0c;而经营战略又为组织的创新战略、产品开发和产品管理提供了环境和方向。使命、愿景与核心价值观对于产品开发的聚焦点和管理方式都具有十分重要的作用。产品开发通常被称为组织的“血液”&#xff0c;…

计算机毕业设计 大学志愿填报系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

什么是485无线通信

在现代通信技术中&#xff0c;无线模块扮演着至关重要的角色&#xff0c;它们使得设备能够在没有物理连接的情况下进行数据交换。485通讯无线模块是这类无线模块中的一种&#xff0c;专门用于实现RS-485通信协议的无线传输。RS-485是一种广泛应用于工业自动化和远程监控系统的串…

Java短信验证码

想利用java给用户发送短信的话&#xff0c;需要我们与电信、移动、联通三大巨头合作&#xff08;其实还有广电&#xff0c;但是比较少用&#xff09;&#xff0c;让它帮你发信息&#xff0c;当然直接与它合作显然是不现实的&#xff0c;所以我们要借助第三方的短信平台来替我们…

基于Python的量化交易回测框架Backtrader初识记录(二)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;基于Python的量化交易回测框架Backtrader初识记录&#xff08;二&#xff09;-CSDN博客 前言&#xff1a;在上一篇文章 基于Python的量化交易回测框架Backtrader初识记录&#xff08;一…

加速开发体验:为 Android Studio 设置国内镜像源

Android Studio 是由 JetBrains 开发的一个官方 IDE&#xff0c;用于 Android 应用开发。由于网络原因&#xff0c;直接从 Google 的服务器下载可能会比较慢或者不稳定。幸运的是&#xff0c;我们可以通过配置国内镜像源来加速下载和更新。 文章目录 &#x1f4af; 修改 Gradle…

网络工程师学习笔记——网络互连与互联网

互联网的定义 由多个网络相互连接组成更大的网络称为互联网 常见的网络设备&#xff08;是网络拓扑结构和网络的基础&#xff09; 物理层 中继器&#xff08;是将传输的信号进行放大&#xff0c;延长传输的距离&#xff09;&#xff0c;集线器也是这样&#xff0c;但是有更多…

【828华为云征文|全面指南:使用华为云Flexus X部署私人图床】

文章目录 华为云Flexus X实例介绍图床功能介绍部署自己的图床准备工作服务器环境确认宝塔软件商店简单图床一键部署域名解析简单图床安装向导页安装环境检测网站基础配置 访问图床登录页使用图床功能验证效果 总结 华为云Flexus X实例介绍 华为云Flexus云服务是专为中小企业和…

Android系统dumpsys命令详解

文章目录 1. dumpsys 的工作原理2. 基本使用方法执行 dumpsys限制 dumpsys 的输出 3. 常见的 dumpsys 服务1. Activity Manager (activity)2. Battery Service (battery)3. Window Manager (window)4. Package Manager (package)5. Power Manager (power)6. Media DRM (media.d…

supermap icilent3d for cesium加载地形并夸大地形

先看效果图 这是没有夸张之前的都江堰 这是夸大五倍后的都江堰 下面展示代码 主要就是加载supermaponline的skt地形然后夸大 <template><div class"PartOneBox"><div id"cesiumContainer"></div></div> </template>…