SpringBoot常用面试题


什么是 Spring Boot?

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

为什么要用 Spring Boot?

Spring Boot 优点非常多,如:

  • 独立运行
  • 简化配置
  • 自动配置
  • 无代码生成和XML配置
  • 应用监控
  • 上手容易

SpringBoot有哪些优点?

  1、独立运行。
     内嵌了servlet,tomat等,不需要打成war包部署到容器中,只需要将SpringBoot项目打成jar包就能独立运行。
 
  2、简化配置
     启动器自动依赖其他组件,简少了 maven 的配置。各种常用组件及配置已经默认配置完成,无需过多干预。
  
  3、避免大量的Maven导入和各种版本冲突
  
  4、应用监控
     Spring Boot 提供一系列端点可以监控服务及应用。

Spring Boot 的核心配置文件有哪几个?它们的区别是什么?

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性;
  • 一些加密/解密的场景;

Spring Boot 的配置文件有哪几种格式?它们有什么区别?

.properties 和 .yml,它们的区别主要是书写格式不同。

1).properties

app.user.name = javastack

2).yml

app:
 user:  name: javastack

另外,.yml 格式不支持 @PropertySource 注解导入配置。

Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

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

@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。代表当前是一个配置类

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

@ComponentScan:Spring组件扫描。

SpringBoot自动配置原理是什么?

1、SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration。

2、查看@EnableAutoConfiguration,其作用是利用AutoConfigurationImportSelector给容器中导入一些组件。

3、查看AutoConfigurationImportSelector,其中public String[] selectImports(AnnotationMetadata annotationMetadata)方法内 最终调用getCandidateConfigurations()方法

4、查看 getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes),获取候选的配置,这个是扫描所有jar包类路径下"META-INF/spring.factories"

5、然后把扫描到的这些文件包装成Properties对象。

6、从properties中获取到EnableAutoConfiguration.class类名对应的值,然后把他们添加在容器中。

  简而言之,整个过程就是将类路径下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到容器中。

SpringBoot 需要独立的容器运行吗?

不需要,SpringBoot内置tomcat/jetty等容器

开启SpringBoot 特性有哪几种方式?

1 继承spring-boot-starter-parent项目

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

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

Spring:主要用来创建IOC容器,依赖注入,实现程序间的松耦合

SpringMVC: 主要是用来做WEB开发,通过各种组件的协调配合,简化Web应用的开发

SpringBoot: SpringBoot更像是一个管家,当使用到对应功能时,只需要导入指定应用启动器,SpringBoot就能够在底层默认其配置,大大简化了开发所需的繁杂配置

SpringBoot启动时都做了什么?

Springboot的启动,主要创建了配置环境 (environment)、事件监听 (listeners)、应用上下文 (applicationContext),并基于以上条件,在容器中开始实例化我们需要的Bean,至此,通过SpringBoot启动的程序
已经构造完成。

你如何理解 Spring Boot 中的 Starters?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?

Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架

SpringBoot中如何解决跨域问题 ?

1、基于WebMvcConfigurerAdapter配置加入Cors的跨域

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

2、创建一个filter解决跨域

项目中前后端分离部署,所以需要解决跨域的问题。 我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。 当用户登录以后,正常使用;

当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。 我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。

3、controller配置CORS

controller方法的CORS配置,您可以向@RequestMapping注解处理程序方法添加一个@CrossOrigin注解,以便启用CORS(默认情况下,@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法)

@CrossOrigin 表示所有的URL均可访问此资源

@CrossOrigin(origins = “http://127.0.0.1:8080”) 表示只允许这一个url可以跨域访问这个controller

@CrossOrigin这个注解用起来很方便,这个可以用在方法上,也可以用在类上。如果你不设置他的value属性,或者是origins属性,就默认是可以允许所有的URL/域访问。

  -value属性可以设置多个URL。
  -origins属性也可以设置多个URL。
  -maxAge属性指定了准备响应前的缓存持续的最大时间。就是探测请求的有效期。
  -allowCredentials属性表示用户是否可以发送、处理 cookie。默认为false
  -allowedHeaders 属性表示允许的请求头部有哪些。
  -methods 属性表示允许请求的方法,默认get,post,head。

什么是 CSRF 攻击?

CSRF 代表跨站请求伪造。这是一种攻击,迫使最终用户在当前通过身份验证的Web 应用程序上执行不需要的操作。CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。

简单来说就是:攻击者盗取合法用户登录信息,通过盗取账户进行登录,然后以合法用户的身份发送恶意请求,但是请求对于服务器来说是合法的。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM