一、引言
Spring Boot的自动装配的本质是从META-INF/spring.factories
文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给Spring容器进行管理,但是到底是如何使用spring.factories文件的呢,我们今天就来源码解析一番。
二、源码解读
几乎任何一个SpringBoot的项目都是从被@SpringBootApplication注解标记的类开始的
@SpringBootApplication
@Slf4j
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
点击SpringApplication.run(),进入SpringApplication类对应的run方法,该方法两个参数,第一个参数是启动类本身,用于解析启动类(解析标记的注解、启动类作为一个配置类,也需要解析),args
是一个可变参数,用于接收传入的虚拟机参数
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class[]{primarySource}, args);
}
观察SpringApplication类的整体结构,发现该类一个参构造方法中有
private List<ApplicationContextInitializer<?>> initializers的赋值
进一步点开getSpringFactoriesInstances方法,发现该方法中似乎有根据名称加载和实例创建的两个方法
首先跟踪SpringFactoriesLoader.loadFactoryNames()方法,该方法的入参数ApplicationContextInitializer.class类,方法体中的返回值语句如下:
(List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
这一行语句可以改成两部分更清晰:
Map<String, List<String>> A= (List)loadSpringFactories(classLoader);
List<String> B=A.getOrDefault(factoryTypeName, Collections.emptyList());