springboot面试题

1、什么是SpringBoot?和传统的Spring有什么区别?

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

  • 简化配置
    比如说一个spring-boot-starter-web 就包含了很多依赖组件,不需要像Spring那样逐个添加依赖。

  • 独立运行
    Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。

  • 无代码生成和XML配置、自动配置
    Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的。核心配置文件是 application 和 bootstrap 配置文件。

缺点也有:
管理复杂、部署复杂
随着服务数量增加,每次部署都要重启验证,服务之间调用、通信也会造成服务器的压力,而且运维工作量也增大,服务监测的工作量也增大。


Spring Boot 的配置文件有哪几种格式?它们有什么区别?
.properties 和 .yml,它们的区别主要是书写格式不同。


3、Spring Boot 的核心注解是什么,自动配置的原理是什么?

springboot 的启动可以通过main方法启动,它的关键注解是 @SpringBootApplication

https://learnjava.baimuxym.cn/pages/SpringBoot%E9%9D%A2%E8%AF%95%E9%A2%98/

最重要的注解就是 @EnableAutoConfiguration,注解内使用到了@import注解来完成导入配置的功能。为什么我们不用写很多配置,就可以直接运行,就是这个注解的功劳。

然后扫描META-INF/spring.factories文件的jar包,该文件中定义了关于初始化,监听器等信息,而真正使自动配置生效的key是org.springframework.boot.autoconfigure.EnableAutoConfiguration

在启动过程中会解析对应类配置信息。每个Configuation类都定义了相关bean的实例化配置。都说明了哪些bean可以被自动配置,什么条件下可以自动配置,并把这些bean实例化出来


4、什么是 Spring Boot Stater ?

可以理解为这是一个启动器,这个启动器会自动依赖其他组件,一站式获取你需要的与spring有关的组件

而不是像spring那样,你需要在pom单独引入spring-core、spring-beans、spring-aop 等等,最最最重要的是,可以省去了版本冲突的问题。还可以通过spring-boot-starter-parent 统一控制版本。


5、spring-boot-starter-parent 的作用是什么?

https://learnjava.baimuxym.cn/pages/SpringBoot%E9%9D%A2%E8%AF%95%E9%A2%98/

统一控制版本

spring-boot-starter-parent 不需要其他依赖包指定版本了,这里都有默认的版本,你可以不需要考虑依赖包的版本了 ,完美解决包冲突问题。

6、SpringBoot、Spring MVC和Spring有什么区别?

  • Spring
    Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。
    当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。

  • Spring MVC
    Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。

  • SpringBoot
    Spring和Spring MVC的问题在于需要配置大量的参数。
    SpringBoot通过一个自动配置和启动的项来解决这个问题。


7、spring-boot-maven-plugin 的作用是什么?

一般的maven项目的打包命令,不会把依赖的jar包也打包进去的,只是会放在jar包的同目录下,能够引用就可以了,但是spring-boot-maven-plugin插件,会将依赖的jar包全部打包进去。

spring-boot-maven-plugin 提供了一些像 jar 一样打包或者运行应用程序的命令:

  • spring-boot:run 运行你的 SpringBooty 应用程序。
  • spring-boot:repackage 重新打包你的 jar 包或者是 war 包使其可执行
  • spring-boot:start 和 spring-boot:stop 管理 Spring Boot 应用程序的生命周期(也可以说是为了集成测试)。
  • spring-boot:build-info 生成执行器可以使用的构造信息。

spring-boot-maven-plugin 会打包成一个可以直接运行的JAR文件,使用”java -jar”命令就可以直接运行。

repackage 功能的 作用,就是在打包的时候,多做一点额外的事情:

1、首先 mvn package 命令 对项目进行打包,打成一个 jar,这个 jar 就是一个普通的 jar,可以被其他项目依赖,但是不可以被执行

2、repackage 命令,对第一步 打包成的 jar 进行再次打包,将之打成一个 可执行 jar ,通过将第一步打成的 jar 重命名为 .original 文件


8、SpringBoot 打成jar和普通的jar有什么区别?

Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,但是,这种 jar 不可以被其他项目依赖,即使依赖了也无法使用其中的类。

通过jar运行实际上是启动了内置的tomcat

Spring Boot 的 jar 无法被其他项目依赖,主要还是它和普通 jar 的结构不同。

普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 BOOT-INFclasses 目录下才是我们的代码,因此无法被直接引用。

如果A模块包依赖了B模块,在B模块的pom文件,加入如下配置即可:

1
2
3
4
5
6
7
8
9
10
11
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>

或者你要打成的jar需要被其他模块依赖,需要这样配置:

1
2
3
4
5
6
7
8
9
10
11
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>

这样会打成两个jar,一个是可以直接运行的,一个exec是可以被其他项目依赖的

我觉得这样没必要,你要打成一个依赖包给其他项目用,那你没必要把这个项目打成可运行的jar,最好的方法就是把依赖项目重新放到一个新的项目,使用true被其他项目依赖即可。