springboot相关面试题

时间:2025-03-18 09:01:24

 

springboot和springmvc的区别

spring boot 内嵌tomcat,Jetty和Undertow容器,可以直接运行起来,不在再做部署;

spring boot 自动配置,减少了xml文件的大量配置;降低了项目搭建的复杂度

Spring MVC是基于 Servlet 的一个 MVC 框架 主要解决 WEB 开发的问题,因为 Spring 的配置非常复杂,各种XML、 JavaConfig、hin处理起来比较繁琐。于是为了简化开发者的使用,从而创造性地推出了Spring boot,约定优于配置,简化了spring的配置流程。

Spring 是一个“引擎”;

Spring MVC 是基于Spring的一个 MVC 框架 ;

Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。

springboot热部署的两种方式

SpringBoot 1.3后才拥有SpringBoot devtools热部署

①:spring-boot-devtools   ②:Spring Loaded

方式一:

在项目的pom文件中添加依赖:

1 <!--热部署jar-->
2 <dependency>
3     <groupId></groupId>
4     <artifactId>spring-boot-devtools</artifactId>
5 </dependency>

然后:使用 shift+ctrl+alt+"/" (IDEA中的快捷键) 选择"Registry" 然后勾选 

方式二:

在项目中添加如下代码

    <build>
        <plugins>
            <plugin>
                <!-- springBoot编译插件-->
                <groupId></groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <dependencies>
                    <!-- spring热部署 -->
                    <!-- 该依赖在此处下载不下来,可以放置在build标签外部下载完成后再粘贴进plugin中 -->
                    <dependency>
                        <groupId></groupId>
                        <artifactId>springloaded</artifactId>
                        <version>1.2.</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>            

添加完毕后需要使用mvn指令运行:

首先找到IDEA中的Edit configurations ,然后进行如下操作:(点击左上角的"+",然后选择maven将出现右侧面板,在红色划线部位输入如图所示指令,你可以为该指令命名(此处命名为MvnSpringBootRun))

点击保存将会在IDEA项目运行部位出现,点击绿色箭头运行即可

springboot配置文件

spring boot使用一个全局配置文件:主要是以下两种类型

application.properties  :例:=9998

application.yml(YAML)  :例:server:

port:8080

配置文件的作用主要是修改spring boot在底层的默认配置

Spring Boot 的核心注解

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { })。

@ComponentScan:Spring组件扫描。
spring boot的starter的执行原理

利用starter实现自动化配置只需要两个条件——maven依赖、配置文件,这里简单介绍下starter实现自动化配置的流程。
引入maven实质上就是导入jar包,spring-boot启动的时候会找到starter jar包中的resources/META-INF/文件,根据文件中的配置,找到需要自动配置的类

Spring Boot与Spring MVC的区别

      Boot是Spring和Spring MVC的整合,而Spring MVC只是Spring的一个模块,一个轻量级的Web层框架

      Boot几乎可以实现零配置,所有功能使用注解进行开发,运用了'约定大于配置'的思想,简化了项目开发

         难度,而Spring MVC需要依赖于xml配置进行开发

     Boot提供了内置的tomcat,可以打成jar包直接运行,也可以使用外置tomcat

     Boot还继承了许多第三方库配置,例如,JDBC, Mongo, Redis等,应用这些第三方库,几乎可以零配置
springcloud的服务注册和发现是怎样的原理

Eureka包含两个组件:Eureka Server和Eureka Client
Eureka Server提供服务注册服务
各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到

EurekaClient是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除(默认90秒)
Eureka三大角色:

    Eureka Server 提供服务注册和发现
    Service Provider服务提供方将自身服务注册到Eureka,从而使服务消费方能够找到
    Service Consumer服务消费方从Eureka获取注册服务列表,从而能够消费服务

作为服务注册中心,Eureka 和 Zookeeper对比的优势:
著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性)、A(可用性)和P(分区容错性)。由于分区容错性P在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡。
因此
Zookeeper保证的是CP,
Eureka则是AP

 mybatis中的#和$的区别

#相当于对数据 加上 双引号,$相当于直接显示数据

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".
2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id. 
3. #方式能够很大程度防止sql注入。
4.$方式无法防止Sql注入。
5.$方式一般用于传入数据库对象,例如传入表名.
6.一般能用#的就别用$.
MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
字符串替换
默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:
ORDER BY ${columnName}
这里MyBatis不会修改或转义字符串。

针对不同的环境下的配置文件有什么区别

dev  produce test

springBoot+druid+mybatis实现数据库交互

     1. 引入pom依赖

     2. druid启动配置

     3. 增加启动类和接口

     4. 增加配置参数

     5. 接口mapper和文件

redis数据类型

字符串 string 数据类型

哈希 hash 数据类型

列表 list 数据类型

集合 set 数据类型

有序集合 zset 数据类型

Redis怎样淘汰数据

  1. 1、 volatile-lru :从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. 2、 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  3. 3、 volatile-random:从已设置过期时间的数据集(server.db[i].expires)中随机挑选数据淘汰
  4. 4、 allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  5. 5、 allkeys-random:从数据集(server.db[i].dict)中随机挑选数据淘汰
6、 no-envivtion(驱逐):禁止驱逐数据

LRU机制:
redis保存了lru计数器,会定时的去更新(redis定时程序severCorn()),每个redis对象都会设置相应的lru值,每次访问对象的时候,redis都会更新。
LRU淘汰机制:在数据集中随机挑选几个键值对,取出其中lru最大的键值对淘汰。所以,redis并不能保证淘汰的数据都是最近最少使用的,而是随机挑选的键值对中的。

TTL机制:redis数据集结构中保存了键值对过期时间表,即 。
TTL淘汰机制:在数据集中随机挑选几个键值对,取出其中最接近过期时间的键值对淘汰。所以,redis并不能保证淘汰的数据都是最接近过期时间的,而是随机挑选的键值对中的。

redis在每服务客户端执行一个命令的时候,会检测使用的内存是否超额

Redis 是如何存储的

Redis中是把数据保存到内存中的,但是它也会定期的把数据写会到硬盘中。

Redis保存数据有两种方式:

  1. 快照模式(Snapshot)

        它支持两种快照模式:

    1.       定时快照,即按一定时间将内存中的数据保存到磁盘上。
    2.       定量快照,即数据变化一定次数后将数据保存到磁盘上。

        你也可以结合这两种方式,比如变化1000次,距离上次保存时间60秒以上才保存数据。.

  2. 写模式(Append Only File);这种模式下Redis会把所以修改数据的命令(如Update,Set)等保存到一个只能追加的ASAP文件中,当Redis重启时,它会把这个文件里的命令重新执行一遍