Springboot自动配置原理+面试回答

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 理解springboot自动装配首先要理解什么是约定优于配置,它的设计目的是用来简化spring应用的初始化搭建以及开发过程,从而使开发人员不在需要定义样板化的配置,按照约定进行编程,是一种软件设计范式

springboot自动配置面试相关内容在文章最后,小伙伴根据选择观看哦

前言:理解springboot自动装配首先要理解什么是约定优于配置,它的设计目的是用来简化spring应用的初始化搭建以及开发过程,从而使开发人员不在需要定义样板化的配置,按照约定进行编程,是一种软件设计范式

首先springboot整合的每一个技术点都会对应着两个类一个是XXXProperties,另一个是XXXAutoConfiguration

XXXAutoConfiguration:帮我们实例化一些组件

XXXProperties:在我们实例化的过程中可能需要一些值,那么就在这个类里给他赋值

拿Mybatis来说,我们只需要导入mybatis的starter在经过简单的配置就可以使用了,

我们可以搜索一个类叫MybatisProperties,这里是springboot帮我们注入属性值,也就是依赖注入,而我们只需要配置必要的信息就可以使用,是因为springboot采用约定大于配置,我们只需要去修改我们需要的那一部分就可以了

然后在看到MybatisAutoConfiguration,首先他有一个注解@Configuration所以他是一个配置类,这个类的主要作用就是帮我们实例化一些组件

在这个文件里都是springboot主动整合的第三方技术所对应的XXXAutoConfiguration类,也就是这个类的全限定名, 然后通过反射的原理就是class.forname来新建这个对象

接下我们来看怎么读到这个这个文件,这个时候来看到主启动类的核心注解:

而核心的注解分别是

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

对于@ComponentScan这个注解还是比较核心的,需要重点理解一下,它是来自于spring框架的一个注解,作用是对指定的package进行扫描,找到其中符合条件的类,默认是搜索被@Component所修饰的配置类,也可以通过指定属性来指定要进行扫描的package,也就是扫描我们的controller等,而他是怎么扫描到的呢,就是根据我们的@EnableAutoConfiguration注解,这个注解点进去有一个@AutoConfigurationPackage

这个继续点进去有一个注册器Registrar

通过这个注册器我们就可以找到当前类所在的包

现在来看一下在MET-INF下的spring.factories是怎么加载的,现在我们还是看到@EnableAutoConfiguration这个注解,这个注解下又导入了一个类@Import({AutoConfigurationImportSelector.class})

简单理解一下@Import:是来自spring框架的一个注解,作用是显示的从其他地方加载配置类的方式,这样可以避免使用性能较差的组件进行扫描

然后继续来看AutoConfigurationImportSelector.class的作用,这个翻译过来的意思为自动配置导入选择器

我们都知道,如果这个类实现了ImportSelector接口,那他肯定重写了一个方法就是selectImports方法,而在这个类里也不例外,这个类里确实有这个方法

他通过getAutoConfigurationEntry来进行导入,我们继续点进去

而这个getCandidateConfigurations方法的返回值是string,而这个方法就是真正帮我们去读到那个spring.factories配置文件

这个集合真正读取到了我们spring.factories所有的自动配置类,而这里面也默认加载了redis的内容,既然加载了redis我们又没导包,那他为什么不报错呢

这个取决于@ConditionalOnClass,这个注解通俗的说就是Spring工程中引用了redis的包 才会构建这个bean,就是说只有在classpath下能找到redisTemplate类才会构建这个bean。

简单理解,加了这个注解的类不一定会生效,只有这个注解里面指定的那个类存在,那么他才会生效,如果不存在那么这个类就不生效,也就是说我们刚刚在getCandidateConfigurations读取到的130多个配置类并没有全部被加载,只是加载了我们引入了依赖的类

因此我们的redistemplate就不需要我们自己new对象了,而是通过ioc控制反转进行外部注入,而stringRedisTemplate是经过序列化后的对象,因为不序列化默认走的是JDK的序列化器,那样存入redis的结果不仅占用内存较高而且不容易阅读

在这里我们就可以发现只要我们导了redis的启动器,我们就不需要配太多的东西就可以使用了

在RedisProperties这个类里,就是我们常用的配置,而默认的host地址是localhost,因此我们只要windows本地启动了redis,我们不需要任何配置文件,就可以使用redis,这样就基本完成我们的自动装配了

继续看回来springboot拿到我们从spring.factories读取的这个集合后到 ImportAutoConfigurationImportSelector的determineImports方法,然后在这里又把这个集合包装成一个set集合,作用是为了去重

然后在这通过各种校验过滤

最后返回一个AutoConfigurationEntry

在这里就是通过@ConditionalOnClass来进行排除过滤

再到这个方法内,他利用String工具类转成一个数组,返回给spring容器,然后再利用类加载器,通过Class.fornaame也就是通过反射的方式帮我们实例化,实例化完成之后帮我们放到IOC容器里

简单来讲:就是通过springboot的核心注解里的选择器,而这个选择器会加载我们的spring.factories文件,拿到这些文件之后通过反射生成对象,在反射生成的时候要先判断我们有没有导包,如果没导包就不生成,导包了就生成,然后通过XXXProperties给属性赋值,没有的我们就需要在yml中自己配置

面试话术:

主配置类启动,通过@SringBootApplication 中的@EnableAutoConfguration 加载所需的所 有自动配置类,然后自动配置类生效并给容器添加各种组件。那么@EnableAutoConfguration 其实是通过它里面的@AutoConfigurationPackage 注解,将主配置类的所在包皮下面所有子包 里面的所有组件扫描加载到 Spring 容器中; 还通过@EnableAutoConfguration 里面的 AutoConfigurationImportSelector 选择器中的 SringFactoriesLoader.loadFactoryNames()方法,获取类路径下的 META-INF/spring.factories 中的 资源并经过一些列判断之后作为自动配置类生效到容器中,自动配置类生效后帮我们进行自 动配置工作,就会给容器中添加各种组件:这些组件的属性是从对应的 Properties 类中获取 的,这些 Properties 类里面的属性又是通过@ConfigurationProperties 和配置文件绑定的:所以 我们能配置的属性也都是来源于这个功能的 Properties 类。SpringBoot 在自动配置很多组件 的时候,先判断容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置 的,如果没有,才自动配置;如果有些组件可以有多个就将用户配置和默认配置的组合起来

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
打赏
0
0
0
0
235
分享
相关文章
|
16天前
|
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
66 7
|
27天前
|
SpringBoot自动装配的原理
在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解构成 , 分别是 ● @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类 ● @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包 ● @EnableAutoConfiguration : 开启自动配置(自动配置核心注解) 2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoC
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
39 0
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
121 12
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
99 17
springboot自动配置原理
美团面试:手机扫描PC二维码登录,底层原理和完整流程是什么?
45岁老架构师尼恩详细梳理了手机扫码登录的完整流程,帮助大家在面试中脱颖而出。该过程分为三个阶段:待扫描阶段、已扫描待确认阶段和已确认阶段。更多技术圣经系列PDF及详细内容,请关注【技术自由圈】获取。
硬核揭秘:线程与进程的底层原理,面试高分必备!
嘿,大家好!我是小米,29岁的技术爱好者。今天来聊聊线程和进程的区别。进程是操作系统中运行的程序实例,有独立内存空间;线程是进程内的最小执行单元,共享内存。创建进程开销大但更安全,线程轻量高效但易引发数据竞争。面试时可强调:进程是资源分配单位,线程是CPU调度单位。根据不同场景选择合适的并发模型,如高并发用线程池。希望这篇文章能帮你更好地理解并回答面试中的相关问题,祝你早日拿下心仪的offer!
66 6
最新版 | SpringBoot3如何自定义starter(面试常考)
在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义starter。最后在测试项目中验证其有效性。这种方式使开发者能够更便捷地管理和维护代码,提升开发效率。
最新版 | SpringBoot3如何自定义starter(面试常考)
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等