SpringBoot面试题


1. spring-boot-starter-parent 有什么用 ?

我们都知道,新创建一个 SpringBoot 项目,默认都是有 parent 的,这个 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:

1、 定义了 Java 编译版本为 1.8 。

2、 使用 UTF-8 格式编码。

3、 继承自 spring-boot-dependencies,这个里边定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号。

4、 执行打包操作的配置。

5、 自动化的资源过滤。

6、 自动化的插件配置。

7、 针对 application.properties 和 application.yml 的资源过滤,包括通过 profile 定义的不同环境的配置文件,例如 application-dev.properties 和 application-dev.yml。

##2. shiro和oauth还有cas他们之间的关系是什么?问下您公司权限是如何设计,还有就是这几个概念的区别。 cas和oauth是一个解决单点登录的组件,shiro主要是负责权限安全方面的工作,所以功能点不一致。但往往需要单点登陆和权限控制一起来使用,所以就有 cas+shiro或者oauth+shiro这样的组合。

token一般是客户端登录后服务端生成的令牌,每次访问服务端会进行校验,一般保存到内存即可,也可以放到其他介质;Redis可以做Session共享,如果前端web服务器有几台负载,但是需要保持用户登录的状态,这场景使用比较常见。

我们公司使用oauth+shiro这样的方式来做后台权限的管理,oauth负责多后台统一登录认证,shiro负责给登录用户赋予不同的访问权限。

3. SpringBoot、Spring MVC 和 Spring 有什么区别?

1、 Spring

Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。

当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。

2、 Spring MVC

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

3、 SpringBoot

Spring 和 SpringMVC 的问题在于需要配置大量的参数。

SpringBoot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,SpringBoot 提供了一些非功能性特征。

4、什么是SpringBoot 1、 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件)

2、 创建独立的spring引用程序 main方法运行

3、 嵌入的Tomcat 无需部署war文件

##4、 简化maven配置

##5、开启 SpringBoot 特性有哪几种方式? 1、 继承spring-boot-starter-parent项目

2、 导入spring-boot-dependencies项目依赖

##6、什么是YAML? YAML是一种人类可读的数据序列化语言。它通常用于配置文件。 与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。

##7、什么是Spring Profiles? Spring Profiles允许用户根据配置文件(dev,test,prod等)来注册bean。因此,当应用程序在开发中运行时,只有某些bean可以加载,而在PRODUCTION中,某些其他bean可以加载。假设我们的要求是Swagger文档仅适用于QA环境,并且禁用所有其他文档。这可以使用配置文件来完成。SpringBoot使得使用配置文件非常简单。

##8、如何在 SpringBoot 中添加通用的 JS 代码? 在源文件夹下,创建一个名为 static 的文件夹。然后,你可以把你的静态的内容放在这里面。

例如,myapp.js 的路径是 resources\static\js\myapp.js

你可以参考它在 jsp 中的使用方法:

错误:HAL browser gives me unauthorized error - Full authenticaition is required to access this resource.

该如何来修复这个错误呢?

两种方法:

方法 1:关闭安全验证

application.properties

management.security.enabled:FALSE

方法二:在日志中搜索密码并传递至请求标头中

##9、SpringBoot 有哪几种读取配置的方式? SpringBoot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量。

##10、SpringBoot 是否可以使用 XML 配置 ? SpringBoot 推荐使用 Java 配置而非 XML 配置,但是 SpringBoot 中也可以使用 XML 配置,通过 @ImportResource 注解可以引入一个 XML 配置。

##11、SpringBoot自动配置的原理是什么? SpringBoot启动的时候通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中所有的自动配置类,并对其进行加载,而这些自动配置类的类名都是以AutoConfiguration结尾来命名的,它实际上就是一个javaConfig形式的Spring容器配置类,它们都有一个@EnableConfigurationPerperties的注解,通过这个注解启动XXXProperties命名的类去加载全局配置中的属性,如server.port,而XXXProperties通过@ConfigurationProperties注解将全局配置文件中的属性与自己的属性进行绑定。

##12、SpringBoot 配置加载顺序? 1、 properties文件 2、YAML文件 3、系统环境变量 4、命令行参数

##13、spring boot初始化环境变量流程? 1、 调用prepareEnvironment方法去设置环境变量

2、 接下来有三个方法getOrCreateEnvironment,configureEnvironment,environmentPrepared

3、 getOrCreateEnvironment去初始化系统环境变量

4、 configureEnvironment去初始化命令行参数

5、 environmentPrepared当广播到来的时候调用onApplicationEnvironmentPreparedEvent方法去使用postProcessEnvironment方法load yml和properties变量

##14、运行 SpringBoot 有哪几种方式? 1、 打包用命令或者者放到容器中运行

2、 用 Maven/ Gradle 插件运行

3、 直接执行 main 方法运行

##15、SpringBoot 中如何解决跨域问题 ? 跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 SpringBoot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。

@Configuration

public class CorsConfig implements WebMvcConfigurer {

@Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); }

}

##16、SpringBoot如何配置log4j? 在引用log4j之前,需要先排除项目创建时候带的日志,因为那个是Logback,然后再引入log4j的依赖,引入依赖之后,去src/main/resources目录下的log4j-spring.properties配置文件,就可以开始对应用的日志进行配置使用。

##17、SpringBoot运行项目的几种方式? 打包用命令或者放到容器中运行

1、 打成jar包,使用java -jar xxx.jar运行

2、 打成war包,放到tomcat里面运行

直接用maven插件运行 maven spring-boot:run

直接执行main方法运行

##18、什么是JavaConfig? Spring JavaConfig是Spring社区的产品,它提供了配置Spring IoC容器的纯Java方法。因此它有助于避免使用XML配置。使用JavaConfig的优点在于:

面向对象的配置。由于配置被定义为JavaConfig中的类,因此用户可以充分利用Java中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean方法等。

减少或消除XML配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在XML和Java之间来回切换。

JavaConfig为开发人员提供了一种纯Java方法来配置与XML配置概念相似的Spring容器。

从技术角度来讲,只使用JavaConfig配置类来配置容器是可行的,但实际上很多人认为将JavaConfig与XML混合匹配是理想的。

类型安全和重构友好。JavaConfig提供了一种类型安全的方法来配置Spring容器。由于Java 5.0对泛型的支持,现在可以按类型而不是按名称检索bean,不需要任何强制转换或基于字符串的查找

##19、运行 SpringBoot 有哪几种方式? 1、 打包用命令或者放到容器中运行

2、 用 Maven/ Gradle 插件运行

3、 直接执行 main 方法运行

20、SpringBoot 常用的 Starter 有哪些? 1、 spring-boot-starter-web :提供 Spring MVC + 内嵌的 Tomcat 。

2、 spring-boot-starter-data-jpa :提供 Spring JPA + Hibernate 。

3、 spring-boot-starter-data-Redis :提供 Redis 。

4、 mybatis-spring-boot-starter :提供 MyBatis 。

##21、在 Spring Initializer 中,如何改变一个项目的包名字? 好消息是你可以定制它。点击链接“转到完整版本”。你可以配置你想要修改的包名称!

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

properties

app.user.name = javastack

yml

app: user: name: javastack

##23、什么是 Swagger?你用 SpringBoot 实现了它吗? Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。它使文档能够以与服务器相同的速度更新。当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。因此,Swagger消除了调用服务时的猜测。

##24、spring boot 核心配置文件是什么?bootstrap、properties 和 application、properties 有何区别 ? 单纯做 SpringBoot 开发,可能不太容易遇到 bootstrap、properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

spring boot 核心的两个配置文件:

bootstrap (、 yml 或者 、 properties):boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud 配置就会使用这个文件。且 boostrap 里面的属性不能被覆盖;

application (、 yml 或者 、 properties): 由ApplicatonContext 加载,用于 spring boot 项目的自动化配置。

##25、什么是Spring Initializer? 这个问题并不难,但面试官总是以此测试候选人的专业知识。

Spring Initializer是一个网络应用程序,它可以生成一个SpringBoot项目,包含快速启动所需的一切。和往常一样,我们需要一个好的项目框架;它有助于你正确创建项目结构/框架。

##26、SpringBoot Starter 的工作原理是什么? SpringBoot 在启动的时候会干这几件事情:

1、 SpringBoot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。

2、 根据 spring.factories 配置加载 AutoConfigure 类

3、 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context

总结一下,其实就是 SpringBoot 在启动的时候,按照约定去读取 SpringBoot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 SpringBoot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

这只是简单的三连环问答,不知道有多少同学能够完整的回答出来。

其实 SpringBoot 中有很多的技术点可以挖掘,希望可以在后期的面试中帮助到大家。

SpringBoot
SpringMVC
  • 作者:崔志鹏(联系作者)
  • 发表时间:2021-07-14 15:40
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论