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
这个注解,点进去源码,看一下具体的实现。
根据图中的信息,我们完全可以看得出来,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容器的过程。