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

文章目录

  • 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.rhkb.cn/news/124174.html

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

相关文章

如何让自己的精力集中 Maven自学笔记 马云演讲观看

目录 如何让自己的精力集中 Avoid having multiple tasks and objects in your line of sight 人的脑袋是给自己思考用的 晚上床上想千条路&#xff0c;早上起床还是走原路 参与才会变得更好 共度灾难&#xff0c;是需要互相鼓励的 CFO Capital 上海各区都有哪些大学?…

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制

LabVIEW对EAST长脉冲等离子体运行的陀螺稳态运行控制 托卡马克是实现磁约束核聚变最有希望的解决方案之一。电子回旋共振加热&#xff08;ECRH是一种对托卡马克有吸引力的等离子体加热方法&#xff0c;具有耦合效率高&#xff0c;功率沉积定位好等优点。陀螺加速器是ECRH系统中…

Kafka3.0.0版本——消费者(消费者组案例)

目录 一、消费者组案例1.1、案例需求1.2、案例代码1.2.1、消费者1代码1.2.2、消费者2代码1.2.3、消费者3代码1.2.4、生产者代码 1.3、测试 一、消费者组案例 1.1、案例需求 测试同一个主题的分区数据&#xff0c;只能由一个消费者组中的一个消费。如下图所示&#xff1a; 1…

设计模式(1) - UML类图

1、前言 最近在阅读 Android 源码&#xff0c;时常碰到代码中有一些巧妙的写法&#xff0c;简单的如 MediaPlayerService 中的 IFactory&#xff0c;我知道它是工厂模式&#xff0c;但是却不十分清楚它为什么这么用&#xff1b;复杂点的像 NuPlayer 中的 DeferredActions 机制…

vulhub-tomcat弱口令

1.启动靶场 进入文件 进入目录 进入到靶场 启动靶场 docker-compose up -d 2.查看 ip地址 3.使用nmap对ip进行 扫描 发现存在8080的端口&#xff0c;并且端口是开放的状态&#xff0c;apache&#xff0c;tomcat搭建的 4.访问ip地址的端口 点击Manager app 6.开启BP进行抓包 随…

vue-cli3项目本地启用https,并用mkcert生成证书

在项目根目录下的vue.config.js文件中&#xff1a; // vue.config.js module.exports {devServer: {host:dev.nm.cngc// 此处开启 https,并加载本地证书&#xff08;否则浏览器左上角会提示不安全&#xff09;https: {cert: fs.readFileSync(path.join(_dirname,./cert.crt)…

UI自动化之混合框架

什么是混合框架&#xff0c;混合框架就是将数据驱动与关键字驱动结合在一起&#xff0c;主要用来回归业务主流程&#xff0c;将核心流程串联起来。 上一篇我们写到了关键字驱动框架&#xff0c;关键字驱动框架是针对一个业务场景的单条测试用例的。 我们以163邮箱的登录到创建…

云计算中的负载均衡技术,确保资源的平衡分配

文章目录 1. 硬件负载均衡器2. 软件负载均衡器3. DNS负载均衡4. 内容分发网络&#xff08;CDN&#xff09; &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;云计算 ✨文章内…

【负载均衡】常见的负载均衡策略有哪些?

文章目录 前言负载均衡分类常见负载均衡策略小结 前言 负载均衡策略是实现负载均衡器的关键&#xff0c;而负载均衡器又是分布式系统中不可或缺的重要组件。使用它有助于提高系统的整体性能、可用性、可靠性和安全性&#xff0c;同时支持系统的扩展和故障容忍性。对于处理大量…

el-form表单动态校验(场景: 输入框根据单选项来动态校验表单 没有选中的选项就不用校验)

el-form表单动态校验 el-form常规校验方式: // 结构部分 <el-form ref"form" :model"form" :rules"rules"><el-form-item label"活动名称: " prop"name" required><el-input v-model"form.name" /…

面试中的时间管理:如何在有限时间内展示最大价值

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

客户端发现pod并与之通信

客户端发现pod并与之通信 pod需要一种寻找其他pod的方法来使用其他pod提供的服务&#xff0c;不像在没有Kubernetes的世界&#xff0c;系统管理员要在用户端配置文件中明确指出服务的精确IP地址 或者主机名来配置每个客户端应用&#xff0c;但同样的方法在Kubernetes中不适用 …

IIS WebDAV配置,https绑定及asp设置

IIS支持标准CGI&#xff0c;因此可以用程序语言针对STDIN和STDOUT开发。 IIS CGI配置和CGI程序FreeBasic, VB6, VC 简单样例_Mongnewer的博客-CSDN博客 IIS支持脚本解释CGI&#xff0c;因此可以用脚本语言针对STDIN和STDOUT开发。 IIS perl python cbrother php脚本语言配置…

(二十三)大数据实战——Flume数据采集之采集数据聚合案例实战

前言 本节内容我们主要介绍一下Flume数据采集过程中&#xff0c;如何把多个数据采集点的数据聚合到一个地方供分析使用。我们使用hadoop101服务器采集nc数据&#xff0c;hadoop102采集文件数据&#xff0c;将hadoop101和hadoop102服务器采集的数据聚合到hadoop103服务器输出到…

3dMax全球学习资源、资源文件和教程 !

此样例教育教程和学习资源旨在提供使用Autodesk 3ds Max时的计划知识和培训、正确的工作流、流程管理和最佳实践。 您在Autodesk三维设计领域的职业生涯 有关使用3ds Max和Maya在计算机图形领域开始职业生涯的提示&#xff08;包括新的3ds Max和Maya介绍教程&#xff0c;以复…

vmware fusion12共享文件夹到虚拟机window10

文章目录 一、window10虚拟机安装VMware Tools二、MAC配置共享文件夹三、使用 一、window10虚拟机安装VMware Tools vmware fusion—虚拟机----安装VMware Tools–一路下一步 确认安装 双击进行安装 一路下一步&#xff0c;傻瓜式安装 二、MAC配置共享文件夹 设置—系…

浅谈Spring

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 一、什么是IOC&#xff1f; IoC Inversion of Control 翻译成中⽂是“控制反转”的意思&#xff0c;也就是说 Spring 是⼀个“控制反转”的容器。 1.1控制反转推导 这个控制反转怎…

类的加载过程

清楚每个环节的操作过程就可以了 1.加载Loading 加载过程&#xff1a; 通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.class对象&#xff0c;作为方法区这个类的各种数…

Gitea--私有git服务器搭建详细教程

一.官方文档 https://docs.gitea.com/zh-cn/说明 gitea 是一个自己托管的Git服务程序。他和GitHub, Gitlab等比较类似。他是从 Gogs 发展而来&#xff0c;gitea的创作团队重新fork了代码&#xff0c;并命名为giteagitea 功能特性多&#xff0c;能够满足我们所有的的代码管理需…

nowcoder NC10 大数乘法

题目链接&#xff1a; https://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571?tpId196&tqId37177&rp1&ru/exam/company&qru/exam/company&sourceUrl%2Fexam%2Fcompany&difficultyundefined&judgeStatusundefined&tags&tit…