高频面试题-请聊一下Springboot自动装配原理

自从SpringBoot的出现,让Java的基本系统搭建过程变得更简单,不需要关心很多的配置文件,也不需要去关心市面上各版本的包存在版本冲突等等的问题,使得SpringBoot让开发人员推崇备至。

SpringBoot

在面试过程中,SpringBoot的面试题也同样是非常频繁的,简单点的有SpringBoot有哪些核心注解?SpringBoot如何启动?SpringBoot中yml配置文件有什么不同之处?等等吧,问这些都是在检测你是否对SpringBoot有了解。

当然还有一些细节点的面试题有SpringBoot如何实现热部署?SpringBoot如何设置服务端口号?SpringBoot如何做到切换不同环境的配置文件?等等,这些问题就不同了,如果面试官问出了这些,许是在检测你是否真正的使用过SpringBoot,或者是否对SpringBoot项目有一定的基础。

除了以上面试题目之外,还会有些问题,用于检测你是否对SpringBoot有更深入的研究,不再局限于使用层面,比如:SpringBoot如何实现的自动装配?SpringBoot中starter的原理?等等。

今天我们就是来说一下SpringBoot中的自动装配原理,自动装配是SpringBoot中的一个非常重要的,也是非常具有特色的功能,下面就来看一下吧。

自动装配

从启动类开始看

说起SpringBoot中的自动装配,首先要从SpringBoot的启动类开始看。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
复制代码

这是一个基本的SpringBoot启动类,我们主要看SpringBootApplication这个注解,点进去源码,看一下具体的实现。

image.png

根据图中的信息,我们完全可以看得出来,SpringBootApplication这个注解,是一个复合注解。

SpringBootConfiguration注解,可能会有些陌生,但是对于@Configuration注解的话,就一定不会了; ComponentScan也是我们在Spring项目中常常会用到的扫描注解。

主要还是来说一下@EnableAutoConfiguration注解,自动配置注解,也可以说自动装配,既然是要聊自动装配原理,那也就是聊一下@EnableAutoConfiguration注解的具体实现了,下面就来看一下吧。

开启自动配置注解@EnableAutoConfiguration

看一下此注解的源码实现,如下图。

image.png

在这个注解实现中,从AutoConfiguration注解开始看起。

简单说下在此之上的注解,如果你写过自定义注解的话,就能很好的分辨这几种的概念了。

@Target({ElementType.TYPE}) : 用于声明注解作用范围,TYPE表示:可用来修饰接口、类、枚举、注解;还有其他的枚举类型,如果有兴趣可以去自行搜索一下。

@Retention(RetentionPolicy.RUNTIME) :用于声明注解的生命周期,RUNTIME表示:在运行时有效。

@Documented :用于声明注解文档化,如果被此注解修饰,就可以用javadoc进行记录,成为了一个公共的API。

@Inherited :用于加强继承效果。
复制代码

回到正题,接着说。

AutoConfiguration注解同样不是实现自动装配的注解,在Spring中,此注解用来扫描实体类Entity等注解。

Import注解才是自动装配的核心,继续深入。

Import注解实现了AutoConfigurationImportSelector类,自动装配也是在这个类中进行了具体的实现。

AutoConfigurationImportSelector类中实现了诸多方法,自动装配的实现则是在selectImports方法中,如图所示。

image.png

从源码中读起来,有一个getCandidateConfigurations方法,进入看一下代码情况。

image.png

这里存在一个断言,意为无法正确的找到spring.factories文件,结果就很自然了,这个方法就是去加载了spring.factories文件,让我们去找一下这个文件里面具体是什么内容吧。

通过IDEA中的当前类定位按钮进行寻找,

image.png

在这里能找到文件,如图:

image.png

文件内容如图:

image.png

可以看出,通过selectImports方法,取到该文件下的一系列类名,随后将这些类自动加载至IOC容器中。

这些类都属于内部存在自动配置的类,同样可以发现这些类名都是以AutoConfiguration结尾的。

总结

自动装配原理就已经说完了,总结一下,就是通过@EnableAutoConfiguration注解,加载AutoConfigurationImportSelector类中的selectImports方法,进而扫描MATE-INF下的spring.factories文件下的自动配置类,并将其装配至IOC容器的过程。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ijiran

一杯咖啡太贵,一块糖就可以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值