当前位置: 首页 > news >正文

SpringBoot常见问题

1 引言

        Spring Boot是一个基于Spring框架的快速开发脚手架,它简化了Spring应用的初始化和搭建过程,提供了众多便利的功能和特性,比如自动配置、嵌入式Tomcat等,让开发人员可以更加专注于业务逻辑的实现。
  Spring Boot还提供了强大的插件体系和广泛的集成,可以轻松地与其他技术栈集成,比如Thymeleaf模板、JPA、MyBatis、Redis、MongoDB等,同时也支持对微服务的开发和管理。
在这里插入图片描述

总之,Spring Boot简单易用、快速开发,是目前最流行的Java框架之一,得到了广大开发者的青睐。

2 常见问题

问题2 Springboot 有哪些优点?

  • 减少开发,测试时间和努力。
  • 使用JavaConfig有助于避免使用XML。
  • 避免大量的Maven导入和各种版本冲突。
  • 通过提供默认值快速开始开发。
  • 没有单独的Web服务器需要。这意味着你不再需要启动Tomcat,Glassfish或其他任何东西。
  • 需要更少的配置 因为没有web.xml文件。只需添加用@ Configuration注释的类,然后添加用
    @Bean注释的方法,Spring将自动加载对象并像以前一样对其进行管理。您甚至可以将
    @Autowired添加到bean方法中,以使Spring自动装入需要的依赖关系中。
  • 基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序:- Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring将在 (application{environment}.properties)中加载后续的应用程序属性文件。

问题3 怎么理解 Spring Boot 中 “约定优于配置”

Spring Boot Starter、Spring Boot Jpa 都是“约定优于配置“的一种体现。都是通过“约定优于配置“的设
计思路来设计的,Spring Boot Starter 在启动的过程中会根据约定的信息对资源进行初始化;Spring
Boot Jpa 通过约定的方式来自动生成 Sql ,避免大量无效代码编写。
约定优于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。

问题4 Spring Boot 如何定义多套不同环境配置?

提供多套配置文件,如:

applcation.properties
application-dev.properties
application-test.properties
application-prod.properties

然后在applcation.properties文件中指定当前的环境spring.profiles.active=test,这时候读取的就是
application-test.properties文件。

问题5 Spring Boot 有哪几种读取配置的方式?

Spring Boot 可以通过

@PropertySource
@Value
@Environment
@ConfigurationProperties

来绑定变量

问题6 SpringBoot 实现热部署有哪几种方式?

主要有两种方式:

  • Spring Loaded
  • Spring-boot-devtools

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

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

问题8 你如何理解 Spring Boot 中的 Starters?

Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring
及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入
spring-boot-starter-data-jpa 启动器依赖就能使用了。
Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递
性依赖。

问题9 Spring Boot 打成的 jar 和普通的 jar 有什么区别 ?

Spring Boot 项目最终打包成的 jar 是可执行 jar ,这种 jar 可以直接通过 java -jar xxx.jar 命令来运行,这种 jar 不可以作为普通的 jar 被其他项目依赖,即使依赖了也无法使用其中的类。Spring Boot 的 jar 无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而 Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将Spring Boot 项目打包成两个 jar ,一个可执行,一个可引用。

问题10 Spring Boot 中如何解决跨域问题 ?

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

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

项目中前后端分离部署,所以需要解决跨域的问题。我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。

@Configuration
public class CorsConfig {@Beanpublic CorsFilter corsFilter() {CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");corsConfiguration.setAllowCredentials(true);UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",corsConfiguration);return new CorsFilter(urlBasedCorsConfigurationSource);}
}

问题11 什么是 CSRF 攻击?

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

返回面试宝典

相关文章:

  • firewall防火墙配置实战
  • 宝塔nginx配置SpringBoot服务集群代理
  • 【教程】autojs使用Intent打开相机拍照并指定存储路径
  • virtualbox虚拟机运行中断,启动报错“获取 VirtualBox COM 对象失败”
  • element 表单提交图片(表单上传图片)
  • 扫盲:什么是webGPU,和webGL对比哪些优点?
  • Java——Stream流的学习
  • 分享一个学英语的网站
  • 若依不分离版本部署流程
  • 【工作记录】基于docker+mysql部署单机版nacos2.0.4@20240219
  • 淘宝商品采集API通过商品id获取商品详情信息
  • 网络安全-一句话木马
  • steam搬砖项目真的假的,2024年到底还能不能做?
  • Linux——网络通信TCP通信常用的接口和tcp服务demo
  • 【springboot+vue项目(十五)】基于Oauth2的SSO单点登录(二)vue-element-admin框架改造整合Oauth2.0
  • 《剑指offer》分解让复杂问题更简单
  • 【RocksDB】TransactionDB源码分析
  • Angular 4.x 动态创建组件
  • create-react-app做的留言板
  • CSS相对定位
  • download使用浅析
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript对象详解
  • JWT究竟是什么呢?
  • leetcode46 Permutation 排列组合
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Vue.js源码(2):初探List Rendering
  • Yeoman_Bower_Grunt
  • 大快搜索数据爬虫技术实例安装教学篇
  • 坑!为什么View.startAnimation不起作用?
  • 码农张的Bug人生 - 见面之礼
  • 免费小说阅读小程序
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #Spring-boot高级
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二十三)Flask之高频面试点
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (六)软件测试分工
  • (万字长文)Spring的核心知识尽揽其中
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)编辑寄语:因为爱心,所以美丽
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .Net多线程总结