第十一节 SpringBoot Starter 面试题

2024-05-25 03:36

本文主要是介绍第十一节 SpringBoot Starter 面试题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、面试题

很多同学的简历都写着熟悉 SpringBoot, 而 Starter 的实现原理被当作的考题的的情况越来越多。

来源牛客网关于 starter 的一些面试题

情景一、路虎一面

情景二、蔚来

情景三、同花顺

Starter 频频出现,因此在面试准备时,这道题是必不可少的。

二、题目精简

  1. SpringBoot 自动装配原理介绍
  2. SpringBoot Starter 装配原理,或者 Starter 的流程
  3. 如何自定义一个 Starter

三、作答细节

3.1 作答技巧

  • 金字塔答题法,从顶层到细节。先粗后细。能让面试官理解你的思路
  • 作答有条理,由粗到细,让面试官不一头雾水,同时也是加分项

3.2 作答方式

第一步:Starter 的原理有几个要素

  1. 自动装配原理
  2. importSelector 扩展机制
  3. spi 机制
  4. 条件装配 (不是必须,但非常具有灵活性)

tips: 从粗粒度抛出三个要素。 让对方能够明白你是懂的,明确做了提炼。

第二步:什么是自动装配、什么是 spi、什么是条件装配

什么是自动装配:

答:自动装配是相对于手动编写配置代码,减少这类代码的编写过程; 它是 SpringBoot 一套独特的机制,通过xxxAutoConfiguration注解等,并基于类路径、bean 等存在,能够将一系列 bean 注入到 Spring 应用中。实现约定大于配置。

什么是 importSelector 扩展机制(核心)

扩展机制是 Springframwork 中的核心接口。 SpringBoot#AutoConfigurationImportSelector 实现了这个类。 ConfigurationParser 中,会处理延迟的 importSelector。 在这一步,实现了将 Starter 配置在 spring.factories 中的全路径名,变成 ConfigurationClass。 从而实现 jar 的扩展加载。

什么是 spi:

答:在 springBoot 中自定义了一套 spi 机制,它依赖于 spring.factories 文件,通过在这里面能够将 xxxAutoConfiguration 引入,从而将此包下面所有相关类都注入到容器中。

什么是条件装配

答:基于条件来判断是否加载 bean。提供了丰富的注解,注入 ClassOnBean 等。通过条件装配提供了灵活性、扩展性。

知道三个问题后,再来说 Starter 的流程。

第三步:一个 Starter 被加载的流程是什么

  1. 首先:springBoot 启动后,会加载启动所有的后置处理器
  2. 其中最关键的后置处理器。 即解析 Configuration 的后置处理器。在这个后置处理器中会调用 ConfigurationParser,它是 spring framework core 中的核心类,解析 configuration 类,把 bean、import、autowired 等注解进行一一解析,然后把所有符合的bean都加载到spring容器中。 ConfigurationParser 是一个递归解析的过程。
  3. 在 ConfigurationParser 中会执行 import 等延迟资源类。
  4. 其中 AutoConfigurationImportSelector 等 importSelector 会被加载。 (@SpringBootApplication 引入)
  5. 在这个过程中,就会将 spring.facotoreis 中 的 xxxAutoConfiguration 类等进行加载。 (spi机制,被加载到 cache map 中,一种特殊的 map,能够通过全路径名反射加载)
  6. 只要能够扫描到这个 xxxAutoConfiguration 类,就能利用 ConfigurationParser 解析整个过程,将所有相关的 bean 进行加载。

抓住关键特性进行组织回答:

1. ConfigurationParserProcessor 后置处理器触发;

2. AutoConfigurationImportSelector 等导入。 importSelector 接口,是特殊的扩展机制接口。刚好 springBoot 扩展这个能力。

3. spring.facotoreis 筛选加载 xxxAutoConfiguration 类;

4. 通过 ConfigurationParser 解析。

围绕这几个核心要点进行回答。然后可以继续追加一些细节。

第四步:说一些使用经验

比如场景题目,可以结合一个案例,比如分布式锁等进行描述。谈一谈你的使用经验

第五步:扩展说一下使用经验

  1. 注意版本维护
  2. 注意 maven 管理
  3. 注意条件装配,留有足够的扩展
  4. auto-configuration,一般会控制相关 bean 的加载

四、技术之外

在面试环节,表达能力非常重要;对于大多数技术人来讲,能够把自己所知道的完美的呈现给面试官并不是一件轻松的事情。 表达能力需要我们刻意练习。输在表达上是一件非常不值得的事情。

五、最后

虽然学了这么多,流程也十分清楚,但是能够将自己知道的表达出来,还需自己总结,然后内化成自己的,不然还是会在面试的时候出现卡壳。这样就得不偿失了。

希望通过本教程,能够深入理解 SpringBoot Starter 的原理,能够总结回答好这个问题。最终拿下 offer。

 已同步发布到公众号:面汤放盐 

掘金账号:第十一节 SpringBoot Starter 面试题 - 掘金 (juejin.cn)

这篇关于第十一节 SpringBoot Starter 面试题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1000368

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S