高频面试题-请聊一下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这个注解,点进去源码,看一下具体的实现。高频面试题-请聊一下Springboot自动装配原理!


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

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


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


开启自动配置注解@EnableAutoConfiguration


看一下此注解的源码实现,如下图。高频面试题-请聊一下Springboot自动装配原理!


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

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

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

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

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

@Inherited :用于加强继承效果。

回到正题,接着说。

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


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

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


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

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


从源码中读起来,有一个getCandidateConfigurations方法,进入看一下代码情况。高频面试题-请聊一下Springboot自动装配原理!


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

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


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



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


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



文件内容如图:


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


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

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


总结


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


上一篇:线程同步:条件变量的使用细节分析


下一篇:java架构之路(多线程)AQS之ReetrantLock显示锁的使用和底层源码解读