高频面试题-请聊一下Springboot自动装配原理!
theme: smartblue
这是我参与8月更文挑战的第2天,活动详情查看: 8月更文挑战
自从SpringBoot的出现,让Java的基本系统搭建过程变得更简单,不需要关心很多的配置文件,也不需要去关心市面上各版本的包存在版本冲突等等的问题,使得SpringBoot让开发人员推崇备至。
SpringBoot
在面试过程中,SpringBoot的面试题也同样是非常频繁的,简单点的有SpringBoot有哪些核心注解?
、SpringBoot如何启动?
、SpringBoot中yml配置文件有什么不同之处?
等等吧,问这些都是在检测你是否对SpringBoot有了解。
当然还有一些细节点的面试题有SpringBoot如何实现热部署?
、SpringBoot如何设置服务端口号?
、SpringBoot如何做到切换不同环境的配置文件?
等等,这些问题就不同了,如果面试官问出了这些,许是在检测你是否真正的使用过SpringBoot,或者是否对SpringBoot项目有一定的基础。
除了以上面试题目之外,还会有些问题,用于检测你是否对SpringBoot有更深入的研究,不再局限于使用层面,比如:SpringBoot如何实现的自动装配?
、SpringBoot中starter的原理?
等等。
今天我们就是来说一下SpringBoot中的自动装配原理,自动装配是SpringBoot中的一个非常重要的,也是非常具有特色的功能,下面就来看一下吧。
自动装配
从启动类开始看
说起SpringBoot中的自动装配,首先要从SpringBoot的启动类开始看。
```java @SpringBootApplication public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
} ```
这是一个基本的SpringBoot启动类,我们主要看SpringBootApplication
这个注解,点进去源码,看一下具体的实现。
根据图中的信息,我们完全可以看得出来,SpringBootApplication这个注解,是一个复合注解。
SpringBootConfiguration
注解,可能会有些陌生,但是对于@Configuration
注解的话,就一定不会了; ComponentScan
也是我们在Spring项目中常常会用到的扫描注解。
主要还是来说一下@EnableAutoConfiguration
注解,自动配置注解,也可以说自动装配,既然是要聊自动装配原理,那也就是聊一下@EnableAutoConfiguration
注解的具体实现了,下面就来看一下吧。
开启自动配置注解@EnableAutoConfiguration
看一下此注解的源码实现,如下图。
在这个注解实现中,从AutoConfiguration注解开始看起。
简单说下在此之上的注解,如果你写过自定义注解的话,就能很好的分辨这几种的概念了。
``` @Target({ElementType.TYPE}) : 用于声明注解作用范围,TYPE表示:可用来修饰接口、类、枚举、注解;还有其他的枚举类型,如果有兴趣可以去自行搜索一下。
@Retention(RetentionPolicy.RUNTIME) :用于声明注解的生命周期,RUNTIME表示:在运行时有效。
@Documented :用于声明注解文档化,如果被此注解修饰,就可以用javadoc进行记录,成为了一个公共的API。
@Inherited :用于加强继承效果。 ``` 回到正题,接着说。
AutoConfiguration注解同样不是实现自动装配的注解,在Spring中,此注解用来扫描实体类Entity等注解。
Import注解才是自动装配的核心,继续深入。
Import注解实现了AutoConfigurationImportSelector
类,自动装配也是在这个类中进行了具体的实现。
AutoConfigurationImportSelector
类中实现了诸多方法,自动装配的实现则是在selectImports方法中,如图所示。
从源码中读起来,有一个getCandidateConfigurations
方法,进入看一下代码情况。
这里存在一个断言,意为无法正确的找到spring.factories文件,结果就很自然了,这个方法就是去加载了spring.factories文件,让我们去找一下这个文件里面具体是什么内容吧。
通过IDEA中的当前类定位按钮进行寻找,
在这里能找到文件,如图:
文件内容如图:
可以看出,通过selectImports方法,取到该文件下的一系列类名,随后将这些类自动加载至IOC容器中。
这些类都属于内部存在自动配置的类,同样可以发现这些类名都是以AutoConfiguration结尾的。
总结
自动装配原理就已经说完了,总结一下,就是通过@EnableAutoConfiguration注解,加载AutoConfigurationImportSelector类中的selectImports方法,进而扫描MATE-INF下的spring.factories文件下的自动配置类,并将其装配至IOC容器的过程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)