前言
我们都知道,使用SpringBoot开发项目非常简便,在以往的SSM框架中,往往会因为一大堆的密密麻麻的xml配置文件而糟心不已。自从SpringBoot的出现,改变了这个现状。我们往往只需要去关注业务实现而不需要去过多分心与固定的且繁琐的配置。而SpringBoot自动装配便是其中一大功臣。
接下来,直接进入正题吧。来了解一下,SpringBoot的自动装配是如何实现的~
从启动类入手
这是springBoot启动类,启动项目从这里运行。那么我们看看这个注解包含了什么吧~
可以看到在SpringBootApplication
接口上有好些注解,下表大概介绍了一下注解的用处
注解名字 | 注解作用 |
---|---|
@Target | 注解的作用目标:就是你的注解可以写在哪个目标上。比如图中的Element.TYPE ,则代表接口,类,枚举,注解 |
@Retention | 保留策略:图中代码为RetentionPolicy.RUNTIME 代表运行时保留 |
@Documented | 生成java文档 |
@Inherited | 表示该父类注解会被子类继承 |
@SpringBootConfiguration | 标注该类是配置类 |
@EnableAutoConfiguration | 重点:自动装配配置 |
@ComponentScan | 扫描组件 |
虽然这么多注解,但是其实重要的就是@EnableAutoConfiguration
,接下来我们也会对这个注解进行深入分析。
从自动配置注解深入
我们点击进入@EnableAutoConfiguration
注解,可以发现:
这个@Import
导入注解又是我们的核心,它传入一个自动配置导入选择器的类。(看这名字起得,一看就知道和自动配置导入有关系了!)
如何导入自动配置
在这个AutoConfigurationImportSelector
类中有这么一个方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(),
this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories.
If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
看这方法名起得,(获取候选配置),正是在下所要找的。方法扫描META-INF/spring.factories
这个文件里的东东来完成自动配置。看到断言了吗,返回配置后,断言配置不为空,如果空了,就说明没有找到自动配置的类。接下来就是找这个文件了,看看里面是些啥东西~
spring.factories揭秘.
这就是很清楚了,就是一堆KV键值对,key是EnableAutoConfiguration
全类名,value则是一大堆全类名列表,代表了自动装配的类。
总结
本质来说,自动装配就是通过配置文件以kv的形式把我们所经常需要配置的类固定到springBoot中,而不再需要我们去手动配置了。反正每次配置都差不多,何必每个项目都去配置呢,对吧!