Spring Boot 是一套快速开发框架,随着微服务架构应用不断普及,Spring Boot的研发技术的掌握已经成为研发人员必会技能。 与此同时,Spring Boot 开源生态建设能力非常强大,提供了很多应用组件,让Spring Boot 有丰富的三方开源软件的使用。
基于上面的情况,Spring Boot 基本上成为了大中型互联网公司面试的必考题。
本文根据公司的一些面试题库的梳理,将核心的知识提供分享给大家。
本文主要包含知识点 30 道,基本可以覆盖常见的 Spring Boot 面试题目。
希望对大家接下来的面试有全面的帮助。
今天我们就不客套了,直接开始!
1、什么是 Spring Boot?
2、Spring Boot 有哪些优点?
3、SpringBoot启动方式
4、SpringBoot中用那些注解?
5、SpringBoot热部署使用什么?
6、热部署原理与热加载区别是什么?
7、SpringBoot如何实现打包?
8、SpringBoot性能如何优化?
9、SpringBoot2.0新特性
10、SpringBoot执行流程
11、如何使用 Spring Boot 实现分页和排序?
12、什么是 Swagger? 你用 Spring Boot 实现了它吗?
13、什么是 Spring Profiles?
14、什么是 Spring Batch?
15、什么是 FreeMarker 模板?
16、如何使用 Spring Boot 实现异常处理?
17、你使用了哪些 starter maven 依赖项?
18、什么是 CSRF 攻击?
19、什么是 WebSockets?
20、什么是 AOP?
21、什么是 Apache Kafka?
22、我们如何监视所有 Spring Boot 微服务?
23、Spring Boot、Spring MVC 和 Spring 有什么区别?
24、什么是自动配置?
25、什么是 Spring Boot Stater ?
26、你能否举一个例子来解释更多 Staters 的内容?
27、创建一个 Spring Boot Project 的最简单的方法是什么?
28、配置文件的需求是什么?
29、你能否举一个以 ReadOnly 为事务管理的例子?
30、发布 Spring Boot 用户应用程序自定义配置的最好方法是什么?
多年来,随着新功能的增加,spring 变得越来越复杂。 只需访问 https://spring.io/projects 页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。
如果必须启动一个新的 Spring 项目,我们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器,添加 spring 配置。 因此,开始一个新的 spring 项目需要很多努力,因为我们现在必须从头开始做所有事情。
Spring Boot 是解决这个问题的方法。 Spring Boot 已经建立在现有 spring 框架之上。 使用spring 启动,我们避免了之前我们必须做的所有样板代码和配置。 因此,Spring Boot 可以帮助我们以最少的工作量,更加健壮地使用现有的 Spring 功能。
Spring Boot 的优点有:
减少开发,测试时间和努力。
使用 JavaConfig 有助于避免使用 XML。
避免大量的 Maven 导入和各种版本冲突。
提供意见发展方法。
通过提供默认值快速开始开发。
没有单独的 Web 服务器需要。 这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东西。 需要更少的配置 因为没有 web.xml 文件。 只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。
你甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。 基于环境的配置 使用这些属性,您可以将您正在使用的环境传递到应用程序: - Dspring.profiles.active = {enviornment}。 在加载主应用程序属性文件后,Spring 将在 (application{environment} .properties)中加载后续的应用程序属性文件。
IDE 运行Application这个类的main方法
在springboot的应用的根目录下运行mvn spring-boot:run
使用mvn install 生成jar后运行
@SpringBootApplication
@Component:
@RestController
Spring Loaded
spring-boot-devtools
部署方式
热部署在服务器运行时重新部署项目
热加载在运行时重新加载class
实现原理
热部署直接重新加载整个应用
热加载在运行时重新加载class
使用场景
热部署更多的是在生产环境使用
热加载则更多的实在开发环境使用
pom文件中主要针对不同的环境设置对应的profile,其中默认激活的是dev环境的配置
然后配置需要包含和过滤的application.properties
然后使用maven的打包命令实现不同环境打包即可
tomcat内存调优 ,更改文件(catalina.sh),启动部分的优化可以移除 @SpringBootApplication 和 @ComponentScan 两个注解来禁用组件自动扫描,然后在我们需要的 bean 上进行显式配置
Spring Boot 2是完全基于java8,http请求方面, 引入了Webflux, 他是基于Spring Webflux, 它是一个新的非堵塞函数式 Reactive Web 框架,
可以用来建立异步的,非阻塞,事件驱动的服务,并且扩展性非常好。
性能对比于之前的同步方式有了一定的提高
db方面,默认引入了HikariCP
替代了之前的tomcat-pool作为底层的数据库连接池, 对比于tomcat-pool,HikariCP拥有更好的性能,总而言之就是提高了db的访问速度。
redis方面
默认引入了Lettuce, 替代了之前的jedis作为底层的redis链接方式,
同样Lettuce底层基于netty框架,使用异步的方式,访问redis,并且如果结合之前的Webflux, 可以达成请求的全异步, 同样对比于之前的jedis,统一了redis和redis-cluster的访问方式,简化了开发人员的使用方式,同时也提高了redis的访问速度
es方面
默认也从之前的支持es2升级到了es5+, es5也出来了一段时间, 大部分的人应该也是通过自己实现来完成es5的对接, 现在springboot2也是进行了es5的支持。
metrics方面
Spring Boot 2引入了Micrometer,来统一metrics的规范,
使得开发人员更好的理解和使用metrics的模块,而不需要关心对接的具体存储是什么东西。
1)开始请求
2)收集各种条件和回调接口
3)通知started()
4)创建并准备Environment
5)通告environmentPrepared()
6) 创建并初始化ApplicationContext
7) 通告contextPrepare(),通告contextLoaded()
8) 调用ApplicationContext的refresh()方法,完成最终程序启动
9)执行ApplicationRunner和CommandlineRunner通告finished()
10)结束
使用 Spring Boot 实现分页非常简单。 使用 Spring Data-JPA 可以实现将可分页的
org.springframework.data.domain.Pageable 传递给存储库方法。
Swagger 广泛用于可视化 API,使用 Swagger UI 为前端开发人员提供在线沙箱。 Swagger 是用于生成 RESTful Web 服务的可视化表示的工具,规范和完整框架实现。 它使文档能够以与服务器相同的速度更新。
当通过 Swagger 正确定义时,消费者可以使用最少量的实现逻辑来理解远程服务并与其进行交互。 因此,Swagger 消除了调用服务时的猜测。
Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册bean。 因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION 中,某些其他 bean 可以加载。
假设我们的要求是 Swagger 文档仅适用于 QA环境,并且禁用所有其他文档。 这可以使用配置文件来完成。 Spring Boot 使得使用配置文件非常简单。
Spring Boot Batch 提供可重用的函数,这些函数在处理大量记录时非常重要,包括日志/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管理。 它还提供了更先进的技术服务和功能,通过优化和分区技术,可以实现极高批量和高性能批处理作业。 简单以及复杂的大批量批处理作业可以高度可扩展的方式利用框架处理重要大量的信息。
FreeMarker 是一个基于 Java 的模板引擎,最初专注于使用 MVC 软件架构进行动态网页生成。 使用 Freemarker 的主要优点是表示层和业务层的完全分离。 程序员可以处理应用程序代码,而设计人员可以处理 html 页面设计。 最后使用 freemarker 可以将这些结合起来,给出最终的输出页面。
Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。 我们通过实现一个ControlerAdvice 类,来处理控制器类抛出的所有异常。
使用了下面的一些依赖项
spring-boot-starter-activemq
spring-boot-starter-security
spring-boot-starter-web
这有助于增加更少的依赖关系,并减少版本的冲突。
CSRF 代表跨站请求伪造。 这是一种攻击,迫使最终用户在当前通过身份验证的 Web 应用程序上执行不需要的操作。 CSRF 攻击专门针对状态改变请求,而不是数据窃取,因为攻击者无法查看对伪造请求的响应。
WebSocket 是一种计算机通信协议,通过单个 TCP 连接提供全双工通信信道。
WebSocket 是双向的 -使用 WebSocket 客户端或服务器可以发起消息发送。
WebSocket 是全双工的 -客户端和服务器通信是相互独立的。
单个 TCP 连接 -初始连接使用 HTTP,然后将此连接升级到基于套接字的连接。 然后这个单一连接用于所有未来的通信
Light -与 http 相比,WebSocket 消息数据交换要轻得多。
在软件开发过程中,跨越应用程序多个点的功能称为交叉问题。 这些交叉问题与应用程序的主要业务逻辑不同。 因此,将这些横切关注与业务逻辑分开是面向方面编程(AOP)的地方。
Apache Kafka 是一个分布式发布 - 订阅消息系统。
它是一个可扩展的,容错的发布 - 订阅消息系统,它使我们能够构建分布式应用程序。 这是一个 Apache 顶级项目。 Kafka 适合离线和在线消息消费。
SpringBoot提供监视器端点以监控各个微服务的度量。 这些端点对于获取有关应用程序的信息(如它们是否已启动)以及它们的组件( 如数据库等)是否正常运行很有帮助。
但是,使用监视器的一一个主要缺点或困难是,我们必须单独打开应用程序的知识点以了解其状态或健康状况。 想象- -下涉及50个应用程序的微服务,管理员将不得不击中所有50个应用程序的执行终端。
1、Spring
Spring最重要的特征是依赖注入。 所有 SpringModules 不是依赖注入就是 IOC 控制反转。
当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。 松耦合应用的单元测试可以很容易的进行。
2、Spring MVC
Spring MVC 提供了一种分离式的方法来开发 Web 应用。 通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
3、SpringBoot
Spring 和 SpringMVC 的问题在于需要配置大量的参数。
Spring Boot 通过一个自动配置和启动的项来目解决这个问题。 为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
Spring 和 SpringMVC 的问题在于需要配置大量的参数。
我们能否带来更多的智能? 当一个 MVC JAR 添加到应用程序中的时候,我们能否自动配置一些 beans?
Spring 查看(CLASSPATH 上可用的框架)已存在的应用程序的配置。 在此基础上,Spring Boot 提供了配置应用程序和框架所需要的基本配置。 这就是自动配置。
启动器是一套方便的依赖没描述符,它可以放在自己的程序中。 你可以一站式的获取你所需要的 Spring 和相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。
例如,如果你想使用 Sping 和 JPA 访问数据库,只需要你的项目包含 spring-boot-starter-data-jpa 依赖项,你就可以完美进行。
让我们来思考一个 Stater 的例子 -Spring Boot Stater Web。
如果你想开发一个 web 应用程序或者是公开 REST 服务的应用程序。 Spring Boot Start Web 是首选。 让我们使用 Spring Initializr 创建一个 Spring Boot Start Web 的快速项目。
Spring Boot Start Web 的依赖项
下面的截图是添加进我们应用程序的不同的依赖项
依赖项可以被分为:
Spring - core,beans,context,aop
Web MVC - (Spring MVC)
Jackson - for JSON Binding
Validation - Hibernate,Validation API
Enbedded Servlet Container - Tomcat
Logging - logback,slf4j
任何经典的 Web 应用程序都会使用所有这些依赖项。 Spring Boot Starter Web 预先打包了这些依赖项。
作为一个开发者,我不需要再担心这些依赖项和它们的兼容版本。
Spring Initializr是启动 Spring Boot Projects 的一个很好的工具。
就像上图中所展示的一样,我们需要做一下几步:
登录 Spring Initializr,按照以下方式进行选择:
选择 com.in28minutes.springboot 为组
选择 studet-services 为组件
选择下面的依赖项
Web
Actuator
DevTools
点击生 GenerateProject
将项目导入 Eclipse。 文件 - 导入 - 现有的 Maven 项目
企业应用程序的开发是复杂的,你需要混合的环境:
Dev
QA
Stage
Production 在每个环境中,你想要不同的应用程序配置。
配置文件有助于在不同的环境中进行不同的应用程序配置。
Spring 和 Spring Boot 提供了你可以制定的功能。
不同配置文件中,不同环境的配置是什么?
为一个制定的环境设置活动的配置文件。
Spring Boot 将会根据特定环境中设置的活动配置文件来选择应用程序的配置。
当你从数据库读取内容的时候,你想把事物中的用户描述或者是其它描述设置为只读模式,以便于 Hebernate 不需要再次检查实体的变化。 这是非常高效的。
@Value 的问题在于,您可以通过应用程序分配你配置值。 更好的操作是采取集中的方法。
你可以使用 @ConfigurationProperties 定义一个配置组件。
你可以在 application.properties 中配置参数。
basic.value: true basic.message: Dynamic Message basic.number: 100
好了各位, 本文到这里就结束了!
如果本文有任何错误,请批评指教,不胜感激 !
最后
看到这里了,你真的很牛,给你点个赞,你也给我点个赞呗。 嘿嘿
整理了 1000 道 2019 年多家公司 java 面试题 400 多页 pdf 文档,还有几百页的Java核心知识点PDF。
欢迎大家领取,点击:789650498加入。验证:CSDN,即可免费领取。
也求个关注,嘿嘿!