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

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

相关文章

Ubuntu yolov5 环境配置

查看Ubuntu版本 $ cat /proc/version Linux version 5.4.0-150-generic (builddbos03-amd64-012) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023虚拟机磁盘扩容 因为在环境搭建过程中遇到了磁盘空间不足的问题&a…

伪静态web.config常见规则写法与参数介绍说明

伪静态web.config常见规则写法与参数介绍说明. 示例1&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <configuration><system.webServer><rewrite><rules><rule name"规则 1" stopProcessing"tru…

css flex:1;详解,配合demo效果解答

前言 给设置了display&#xff1a;flex的子组件设置了flex&#xff1a;1&#xff1b;就能让他填满整个容器&#xff0c;如果有多个就平均 flex&#xff1a;1&#xff1b;是另外三个样式属性的简写&#xff0c;等同 flex-grow: 0; flex-shrink: 1; flex-basis: auto;我们就针…

Grafana之魔法:揭秘数据可视化的艺术

在数据驱动的时代&#xff0c;如何有效地呈现和理解数据成为了每个组织和个人的核心任务。Grafana作为一个领先的开源数据可视化工具&#xff0c;为我们提供了强大的功能和灵活性。本文将深入探讨Grafana的魔法&#xff0c;以及它如何帮助我们更好地理解数据。 Grafana简介 G…

9月7日扒面经

redis缓存用在哪里&#xff0c;用本地缓存行不行? 数据库查询缓存&#xff0c;减小数据源压力&#xff0c;提高响应速度 页面缓存&#xff1a;将页面的渲染结果缓存在Redis中&#xff0c;以减少页面生成的时间和服务器负载。 频繁计算结果缓存&#xff1a;将频繁计算的结果…

【Unity每日一记】WheelColider组件汽车游戏的关键

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

线性代数的学习和整理18:什么是维度,什么是秩?秩的各种定理秩的计算 (计算部分未完成)

目录 0 问题引出&#xff1a;什么是秩&#xff1f; 概念备注&#xff1a; 1 先厘清&#xff1a;什么是维数&#xff1f; 1.1 真实世界的维度数 1.2 向量空间的维数 1.2.1 向量空间&#xff0c;就是一组最大线性无关的向量组/基张成的空间 1.3 向量α的维数 1.3.1 向量的…

认识doubbo和rpc

开个新坑&#xff0c;和大家一起学习Dubbo 3.X。我们按照一个由浅入深顺序来学习&#xff0c;先从使用Dubbo开始&#xff0c;再深入Dubbo的核心原理。 今天我们就从认识Dubbo开始&#xff0c;整体的内容可以分为3个部分&#xff1a; Dubbo是什么RPC是什么Dubbo的架构 正式开…

使用navicate快速将Excel中的数据导入到数据库

表名称上右键&#xff0c;导入向导 这种方式速度还是很快的&#xff0c;18万条数据&#xff0c;3分钟左右就导入进去了。

postgresql-多表连接

postgresql-多表连接 内连接查询左外连接查询右外连接查询全外连接查询交叉连接查询简写 总结 内连接查询 内连接用于返回两个表中匹配的数据行&#xff0c;使用关键字INNER JOIN表示&#xff0c;也可以简写成JOIN&#xff1b; selecte.first_name ,d.department_id fromcps…

zookeeper 3.8.1安装和入门使用

1、zookeeper环境搭建&#xff08;Windows单机版&#xff09; 1.1、 前提 必须安装jdk 1.8&#xff0c;配置jdk环境变量&#xff0c;步骤略 1.2、安装zookeeper 地址&#xff1a;https://zookeeper.apache.org/ 1.2.1、选择releases版本 1.2.2、下载安装包并解压 1.2.3、配…

网络丢包问题,敢不敢这样定位?

下午好&#xff0c;我的网工朋友。 所谓丢包&#xff0c;是指在网络数据的收发过程中&#xff0c;由于种种原因&#xff0c;数据包还没传输到应用程序中&#xff0c;就被丢弃了。 这些被丢弃包的数量&#xff0c;除以总的传输包数&#xff0c;也就是我们常说的丢包率。 丢包…

3种轻量化框架总结

一般的卷积神经网络的参数量和计算量都很大&#xff0c;很难应用在资源有限的场景中。为了解决这个问题&#xff0c;通常是在训练好的模型上进行优化&#xff0c;如通过对模型压缩减少计算量和存储成本&#xff0c;也可以通过剪枝连接方法去掉了不重要的神经元连接或者通道修剪…

无涯教程-JavaScript - BESSELY函数

描述 BESSELY函数针对x的指定顺序和值返回Bessel函数Yn(x)(也称为Weber函数或Neumann函数)。 语法 BESSELY(X, N)争论 Argument描述Required/OptionalXThe value at which to evaluate the function.RequiredNThe order of the function. If n is not an integer, it is tr…

Spring中Endpoint、HasFeatures、NamedFeature和Actuator的关系及实现原理

文章目录 1. 关系缘由2. Actuator简介及简单使用3. Endpoint和Actuator的关系4. Endpoint和HasFeatures的关系5. Endpoint和HasFeatures原理解析5.1 Endpoint的实现原理5.2 HasFeatures的实现原理 6. 个人闲谈 1. 关系缘由 我们经常可以在Springboot中看到Endpoint注解&#x…

什么牌子的led台灯质量好?热门的Led护眼台灯推荐

led台灯有环保无污染、耗能低、长寿命等优点&#xff0c;适合用在阅读、书写、批阅等办公或学习的场所。而挑选LED台灯时&#xff0c;分散光挡板做的比较好的优先选择&#xff0c;能分散大量蓝光&#xff0c;对眼睛危害较小。下面&#xff0c;小编为大家推荐五款质量好的led护眼…

EF框架基础应用入门

文章目录 一、介绍二、EF6框架基础1. 数据模型和实体类2. 数据库上下文&#xff08;DbContext&#xff09;介绍3. 配置数据模型与数据库表的映射关系 两种方式Fluent API和数据注解Fluent API数据注解 4. 数据库迁移&#xff08;Migration&#xff09;概述a. 创建初始迁移b. 更…

Vulnhub: Masashi: 1靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.236 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.236查看80端口的robots.txt提示三个文件 snmpwalk.txt内容&#xff0c;tftp服务在1337端口 sshfolder.txt内容&#xff0c…

日200亿次调用,喜马拉雅网关的架构设计

说在前面 在40岁老架构师 尼恩的读者社区(50)中&#xff0c;很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近&#xff0c;尼恩指导一个小伙伴简历&#xff0c;写了一个《API网关项目》&#xff0c;此项目帮这个小伙拿到 字节/阿里/微博/…

管理类联考——数学——汇总篇——知识点突破——数据分析——计数原理——减法原理除法原理

减法原理 正面难则反着做(“ − - −”号) 【思路】当出现“至少、至多”、“否定用语"等正面较难分类的题目&#xff0c;可以采用反面进行求解&#xff0c;注意部分反面的技巧以及“且、或"的反面用法。 除法原理 看到相同&#xff0c;定序用除法消序( “ &quo…