1、前言
第一个次听说,Springboot的时候,感觉他是一个流行的框架,但是当我真正去学习它,才发现Springboot是基于Spring的,他并不是一个新的框架,只是他做了需要我们自己去做的Spring bean的配置。在Spring boot流行之前,我们采用springmvc框架来开发web应用,那是我们需要写许多配置文件,在Spring支持注解开发后,在一定程度上简化了配置,但是还是相对来说比较麻烦。这时候Springboot就体现出他的优势,springboot只需要一个properties或者yml文件就可以简化spring mvc中在xml中需要配置的一大堆的bean,这就是因为springboot有自动配置,那么自动配置原理是什么呢?
2、正文
我们知道Springboot可以帮助我们减少很多配置,它的核心理念就是约定大于配置,下面我们看一下是如何实现的。
首先从主程序入手
@SpringBootApplication
public class BootWeb01Application {
public static void main(String[] args) {
SpringApplication.run(BootWeb01Application.class, args);
}
}
@SpringBootApplication这是一个主程序标识,我们点进去,可以看出它是由一系列注解组合而成的,我们重点关注
@SpringBootConfiguration
我们点进去之后,发现是@Configuration注解,这就是说通过@Configuration注解配置类代替xml文件配置
@ComponentScan
组件扫描注解,这个注解会自动注入所有在主程序所在包下的组件,所以我们在写程序的时候,需要把我们写的程序放在主程序目录下。
@EnableAutoConfiguration
开启自动配置功能,接把bean装配到ioc容器中,@EnableAutoConfiguration也是一个组合注解,我们点进去看一下
注意@Import({AutoConfigurationImportSelector.class}),我们点进去看一下,配置信息是从哪里来的
在这部分中,核心方法是getCandidateConfigurations,我们来看下这个方法
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
//从工厂中获取自动配置类
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
//这句断言很重要,告诉了我们工厂是去哪里找自动配置类的,这里显然META-INF/spring.factories是一个路径
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;
}
我们按照路径,找到配置文件
这里面有所有的Spring相关配置
部分截图如下
小结:springboot所有的自动配置在启动的时候扫描并加载:META-INF/spring.factories里面的所有配置类,但是不一定生效,要判断条件是否成立,只要导入相应的start,就有对应的启动器,有了启动器,我们的自动配置就会生效。
3、总结
Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载META-INF下的spring.factories中注册的各种AutoConfiguration类,当自动配置类满足其注解@Conditional指定的生效条件,也就是有了对应的启动器,自动配置生效,并注入Spring容器,就可以完成依赖框架的自动配置。