【Spring面试】一、SpringBoot启动优化与Spring IoC

news2024/9/24 23:25:55

文章目录

  • Q1、SpringBoot可以同时处理多少请求
  • Q2、SpringBoot如何优化启动速度
  • Q3、谈谈对Spring的理解
  • Q4、Spring的优缺点
  • Q5、Spring IoC容器是什么?作用与优点?
  • Q6、Spring IoC的实现机制是什么
  • Q7、IoC和DI的区别是什么
  • Q8、紧耦合与松耦合的区别,如何编写松耦合的代码

Q1、SpringBoot可以同时处理多少请求

调试:

写一个测试接口:

@RestController
@Slf4j
public class RequestController{
	@GetMapping("/test")
	public String test(HttpServletRequest request) throws Exception{
		log.info("线程:{}",Thread.currentThread().getName());
		Thread.sleep(2000);  //睡两秒
		return "success";
	}
}

服务配置中的相关参数:

server:
  tomcat:
    threads:
      # 最少线程数
      min-spare: 10
      # 最多线程数
      max: 20
    # 最大连接数
    max-connections: 30
    # 最大等待数
    accept-count: 10

此时,JMeter模拟100QPS:

在这里插入图片描述

成功40个,刚好是(max-connections)+(accept-count),而这两个参数的默认值可以在Spring-boot-autoconfigure.jar的配置元数据的json文件spring-configuration-metadata.json中找到:(当然也可以直接在application.yaml中按住Ctrl去源码找)

在这里插入图片描述

答案:
max-connections默认值为8192,accept-count默认值100,因此默认情况下,可同时处理8192+100=8292

知识点补充:

1、关于spring-configuration-metadata.json文件

配置spring-configuration-metadata.json文件后,在IDEA中编写application.yaml等配置文件时,会有提示。

在这里插入图片描述

要做一个体验良好的Starter,这个文件还是非常重要的,对于使用你封装的开发者来说,写配置的时候就会方便很多。关于这个文件的生成,需要引入依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

当再次编译的时候,​​spring-configuration-metadata.json​​文件就自动出现了。参考【spring-configuration-metadata.json】

2、关于各参数含义

在这里插入图片描述

首先把web服务器当作是一个饭店:

  • 最小工作线程数:这个饭店里正式员工的厨师
  • 最大工作线程数:当客人很多时,正式员工忙不过来,又来了兼职厨师(即最小线程数下,菜炒不完了)
  • 最大连接数:饭店里最多可容纳的客人数量
  • 最大队列数:店里坐不下了,去外面小板凳上坐下排队的人,即最多可以排队的人数。

按照上面调试代码里的配置,则:正式厨师10个,可招兼职的最多20个,店里能做30人,门口10个小板凳。某一会,来了100个客人,则只能先安排40个,另外60个不会光速走人,会先观望一下,即有自己的超时时间,等到了超时时间,还没轮到他进去吃,则走人,msg为connected timeout。(我上面代码中执行一次休眠2秒,而Jmeter中我设置的timeout时间为200ms,所以表现出来是60个人全部走人了)

在这里插入图片描述

Q2、SpringBoot如何优化启动速度

一般在SpringBoot项目启动中比较耗时的任务比如:数据库建立连接、初始线程池的创建等,可通过延迟这些操作的初始化来优化启动速度。

A1:开启bean的懒加载

SpringBoot 2.2版本引入spring.main.lazy-initialization属性,配置为true,开启懒加载,可将所有Bean延迟初始化。

spring:
  main:
    lazy-initialization: true

A2:创建扫描索引

Spring5之后提供了Spring-context-indexer功能,通过在编译时创建一个静态候选列表来提高大型应用程序的启动性能。首先引入依赖:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-indexer</artifactId>
  <optional>true</optional>
</dependency>

然后在启动类上加一个@Indexed注解,这样编译打包时会在项目中生成META-INF/spring.components文件。这个索引文件里,是提前将@ComponentScan需要扫描的bean全部建立好索引并排好顺序,然后项目启动时就根据这个文件来加载我们所有的Bean

A3:其余思路整理:

  • 减少@ComponentScan @SpringBootApplication扫描类时候的范围
  • 关闭 Spring Boot 的JMX监控,设置spring.jmx.enabled=false
  • 设置JVM参数-noverify ,不对类进行验证
  • 对非必要启动时加载的Bean,延迟加载
  • 使用SpringBoot的全局懒加载
  • AOPQ切面尽量不使用注解方式,这会导致启动时扫描全部方法
  • 关闭endpoint的一些监控功能
  • 排除项目多余的依赖
  • swagger扫描接口时,指定只扫描某个路径下的类
  • Feign客户端接口的扫描缩小包扫描范围

A4:还可尝试一些新特性:

  • JDK12后支持G1、JDK13后支持ZGC,可将未使用的内存及时归还给操作系统
  • SpringBoot3的新特性spring-graalvm-native,可将SpringBoot应用程序编译成本地可执行的镜像文件(显著优化!)

Q3、谈谈对Spring的理解

答案:

Spring是一个生态,可以构建java应用所需的一切基础设施,比如SpringCloud、SpringData、SpringSecurity…通常Spring指的就是Spring Framework。另外:

  • Spring是一个轻量级的开源容器框架
  • Spring是为了解决企业级应用开发的业务逻辑层和其他各层对象和对象直接的耦合问题
  • Spring是一个IOC和AOP的容器框架:IOC控制反转、面向切面编程AOP、包含并管理应用对象的生命周期的容器

Q4、Spring的优缺点

A1:方便解耦,简化开发

通过Spring提供的IoC容器,集中管理对象,使得对象和对象之间的耦合度降低,避免硬编码造成的程序过度耦合,方便维护对象。

A2:AOP的支持:

在不修改原代码的情况下,对业务代码进行增强,减少重复代码,方便维护。

A3:声明事务的支持:

使用@Transactional注解进行声明式的事务管理,不再关注烦闷的事务管理代码,提高开发效率。

A4:程序测试方便:

Spring对Junit4的支持,可以通过注解方便的测试Spring程序。

A5:方便集成各种优秀框架:

集成能力非常强,只需要做简单配置就可以集成第三方框架。(Spring底层源码提供了非常多的可扩展接口)

A6:降低了Java EE中API的使用难度

Spring对Java EE中很多步骤繁琐的API,如JDBC、JavaMail、远程调用等提供了封装

A7:学习的范例

Spring源码底层的实现,比如大量的反射、设计模式、扩展接口等值得学习。但上层使用越简单,下层封装和实现就越复杂,想阅读源码后做扩展也就不容易了。

Q5、Spring IoC容器是什么?作用与优点?

答案:

Ioc,Inversion of Controller,即控制反转。

UserService service = new UserService();

以上这种写法耦合度太高,后期发生修改时维护不方便,引入IoC容器即将创建对象的控制权交给Spring的IoC,在需要某对象的时候直接通过DI(依赖注入)@Autowired自动注入就可以使用对象。简言之,优点就是:

  • 集中管理对象,方便维护
  • 降低耦合度

在这里插入图片描述

Q6、Spring IoC的实现机制是什么

答案:

简言之是工厂+反射。以下以基于xml文件为例来说明:

在这里插入图片描述
核心代码:

//反射
return Class.forName("全类名").newInstance();

Spring提供了一个接口BeanFactory。这个接口是Spring实现IOC容器的顶级接口,这个接口是Spring内部使用的,并不是专门为框架的使用者提供的。

在这里插入图片描述

我们一般使用的是BeanFactory的子接口ApplicationContext接口,这个接口提供了更多并且更加强大的功能。在ApplicationContext接口中有三个常用的实现类分别是:AnnotationConfigApplicationContext、FileSystemXmlApplicationContext、ClassPathXmlApplicationContext。容器的创建需要读取配置文件或配置类,通过这些配置告诉Spring哪些bean是需要Spring来进行管理的

关于这三个类的使用注意点:

在这里插入图片描述

Q7、IoC和DI的区别是什么

答案:

IoC是一种设计的思想和理念,DI是实现IoC重要的一环。通过DI,IOC可以将依赖项注入到对象中。DI的实现方式主要有:

  • 构造方法注入: 被注入的对象可以通过在其构造方法中声明参数列表,让 IoC 容器知道它需要依赖哪些对象
  • setter 注入: 为其需要依赖的对象增加 setter 方法,可以通过 setter 方法将其依赖的对象注入到对象中
  • 接口注入:基本废弃

Q8、紧耦合与松耦合的区别,如何编写松耦合的代码

答案:

紧耦合即类和类之间高度依赖,如UserService中来UserMapper userMapper = new UserMapper()。编写松耦合代码可以通过以下几点:

  • 单一职责原则
  • 接口分离原则
  • 依赖倒置原则

早期电脑,很多配件集中在一起,坏掉一个组件,则整个电脑都得扔或者拆开来修。用单一职责原则,则是主机、显示屏、键盘、鼠标分开,如下图:(对比代码就是不要所有功能写一个类里,以及面向过程与面向对象)

在这里插入图片描述
仅靠单一职责,不能完全实现松耦合,如早期的鼠标接在主板上,此时连接处发生故障也不好修,因此再加入接口分离原则:

在这里插入图片描述
此时,鼠标故障,拔掉换一个就行,类比代码中,比如Dao层更换实现,或者Service调Dao的方法,Dao更改,不影响Service,但可插拔并不带表是可热插拔。不能鼠标一拔,电脑直接不能用了,那再加入依赖倒置原则DIP,而IoC则正好契合了这种原则。

在这里插入图片描述

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

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

相关文章

算法训练day38|动态规划 part01(理论基础、LeetCode509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯)

文章目录 理论基础什么是动态规划动态规划的解题步骤 509. 斐波那契数思路分析代码实现思考总结 70. 爬楼梯思路分析代码实现思考总结 746. 使用最小花费爬楼梯思路分析代码实现 理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c…

【虚拟机开不了】linux、centOS虚拟机出现entering emergency mode解决方案

按他的操作输入journalctl之后输入shiftg到日志最后查看报错发现是xfs&#xff08;dm-0有问题&#xff09; xfs_repair -v -L /dev/dm-0 reboot解决问题

生信豆芽菜-XGboost构建诊断模型

网址&#xff1a;http://www.sxdyc.com/xgboostBuilds 1、准备数据 训练集表达谱数据 训练集样本分组数据 验证集表达谱数据 验证集样本分组数据 2、提交等待运行结果即可 当然&#xff0c;如果不清楚数据是什么样的&#xff0c;可以选择下载我们的示例数据&#…

PostMan传时间参数一次性发送多次请求

文章目录 1. Date类型的参数&#xff0c; "date": "2023-09-07 22:01:51"格式会报错2. 在Pre-request Script预置时间3. 使用postman一次性发送多次请求 1. Date类型的参数&#xff0c; “date”: "2023-09-07 22:01:51"格式会报错 2. 在Pre-req…

NumPy模块:Python科学计算神器之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…

巨人互动|Google海外户Google分析的基础概念

Google Analytics&#xff08;谷歌分析&#xff09;是最受欢迎的网站分析工具之一。它为网站管理员提供了深入了解其网站访问者的机会&#xff0c;并通过数据分析提供有关网站流量、用户行为和转化率的洞察。 1、跟踪代码&#xff08;Tracking Code&#xff09; 跟踪代码是嵌入…

网络技术二十二:NATPPP

NAT 转换流程 产生背景 定义 分类 常用命令 PPP PPP会话建立过程 认证 PPP会话流程

pdf怎么转换成dwg格式?简单转换方法分享

当我们需要在CAD中编辑PDF文件中的向量图形时&#xff0c;将PDF转换成DWG格式是一个非常好的选择。因为PDF是一种非常流行的文档格式&#xff0c;很多时候我们会接收到PDF文件&#xff0c;但是PDF文件中的向量图形无法直接在CAD中编辑。而将PDF转换成DWG格式后&#xff0c;就可…

米贸搜什么是网站排名流量

当谈到数字营销时&#xff0c;你的网站应该作为线上营销的中心枢纽。包括&#xff1a;Ads付费广告、EDM邮件营销、SEO搜索引擎优化等都旨在吸引用户访问你的网站&#xff0c;并在网站上进行深度转化。 被广泛应用且最有效的营销策略之一就是SEO&#xff0c;流量排名是衡量网站受…

Editplus小技巧:一次删除连续的多个空格

Editplus小技巧&#xff1a; 一次删除连续的多个空格 AltDel 请看上图&#xff0c;文件中的多个空格 请看上图&#xff0c;使用快捷键很快就删除了&#xff0c;有点Vim的感觉&#xff0c;爽&#xff01; 查看Editplus更多的快捷键&#xff1a; Tools>>Preferences 如…

学习Harmony之前必了解的术语,否则一脸懵

以下开发前必须了解 1. HarmonyOS SDK --- 官方SDK 2. DevEco Studio 官方开发工具 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发&#xff0c;提供了代码智能编辑、低代码开发、双向预览等功能&#xff0c;以及轻量构建工具DevEco Hvigor 、本地模…

WMS系统中的出入库实时监控

一、定义&#xff1a; 出入库实时监控是指通过仓储管理系统&#xff08;WMS&#xff09;对仓库内部的物流活动进行实时跟踪、监控和控制的过程。它涉及到对货物的进出仓库、货位的变动、库存的数量和状态等信息的及时记录和更新&#xff0c;以便企业能够准确掌握库存情况、优化…

USB Server集中管控加密狗,浙江省电力设计院正在用

近日&#xff0c;软件加密狗的分散管理和易丢失性&#xff0c;给拥有大量加密狗的浙江省电力设计院带来了一系列的问题。好在浙江省电力设计院带及时使用了朝天椒USB Server方案&#xff0c;实现了加密狗的集中安全管控&#xff0c;避免了加密狗因为管理不善和遗失可能带来的巨…

智能配电房管理

智能配电房管理依托电易云-智慧电力物联网&#xff0c;利用先进技术手段&#xff0c;对配电房进行智能化、自动化的管理&#xff0c;以提高配电房的安全性、可靠性和效率。 智能配电房管理包括&#xff1a; 1.实时监测&#xff1a;通过传感器、监控设备等手段&#xff0c;对配…

小程序:实现翻页功能(解决数据过载)

效果 核心代码 ①wxml设置翻页标签 <view class"pagination" wx:if"{{list.length>0}}"> <view class"page-button" bindtap"prevPage">上一页</view> <view class"page-info">{{ page }}<…

Friend.tech热潮未过,在推特刷屏的TipCoin又是个啥?

Web3社交赛道风起云涌&#xff0c;Friend.tech的热潮还没过&#xff0c;最近又有一款名为Tip Coin社交项目在X&#xff08;前Twitter&#xff09;开始刷屏。 TipCoin作为一款社交类区块链项目依托于X平台&#xff0c;用户通过在X平台上发布内容来进行“挖矿”&#xff0c;获得项…

无涯教程-JavaScript - BITAND函数

描述 BITAND函数返回两个数字的按位" AND"。 语法 BITAND (number1, number2)争论 Argument描述Required/Optionalnumber1 Must be in decimal form and greater than or equal to 0.Requirednumber2Must be in decimal form and greater than or equal to 0.Req…

Vuepress样式修改内容宽度

1、相关文件 一般所在目录node_modules\vuepress\theme-default\styles\wrapper.styl 2、调整宽度&#xff0c;截图中是已经调整好的&#xff0c;在我电脑上显示刚刚好。

(其他) 剑指 Offer 46. 把数字翻译成字符串 ——【Leetcode每日一题】

❓ 剑指 Offer 46. 把数字翻译成字符串 难度&#xff1a;中等 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”。…

使用git把本地项目关联远程代码仓库,并推送到远程仓库

你在本地新建了一个项目&#xff0c;写好了代码&#xff0c;但是没有关联远程仓库&#xff0c;怎么关联并上传呢&#xff1f; 你要先去gitee创建一个代码仓库&#xff0c;然后复制http地址。 首次提交项目代码到一个新建的远程仓库&#xff1a; 方式一(推荐)&#xff1a; 1…