接下来我们来介绍一个能让springboot火的原因之一,SpringBoot自动配置原理
首先在我们启动springboot时它会通过@springBootApplication加载主类,然后通过@EnableAutoConfiguration启动自动配置。
现在才到了我们自动配置的过程,首先会调用主类的main()中的run方法,
package com.mohan.demo01;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Demo01Application {
public static void main(String[] args) {
SpringApplication.run(Demo01Application.class, args);//此run方法为自动配置的开始。
}
}
进入run方法之后我们可以看出run()方法中又返回了一个run(),而且它实例化里我们的入口类,并返回,
然后继续来看我们返回的的run()中,它返回了一个SpringApplication实例对象并继续把我们的入口类一并返回。
此时我们又要进入到SpringApplication()中,我们来说一下这个方法中的代码的作用,
public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
this.sources = new LinkedHashSet();
this.bannerMode = Mode.CONSOLE;
this.logStartupInfo = true;
this.addCommandLineProperties = true;
this.addConversionService = true;
this.headless = true;
this.registerShutdownHook = true;
this.additionalProfiles = new HashSet();
this.isCustomEnvironment = false;
this.resourceLoader = resourceLoader;//资源加载器
Assert.notNull(primarySources, "PrimarySources must not be null");
//把传入的对象转化为List集合并添加到集合中
this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
/**通过这个方法来判断项目的类型,然后根据项目类型加载配置文件。
项目类型分为:NONE,SERVLET,REACTIVE三种,
*/
this.webApplicationType = WebApplicationType.deduceFromClasspath();
/* 调用了带一个参构造方法,然后初始化ApplicationListener类,
*/ this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = this.deduceMainApplicationClass();
}
调用这个构造方法之后进入这个方法,又发现返回了一个带两个参数的构造方法,执行这个方法。
来到这个方法我们先看方法中的都干了什么事情,
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
//类的资源加载器
ClassLoader classLoader = this.getClassLoader();
//这个集合存放的是META-INF/spring.factories 下自动配置类的全路径,加载时会判断类资源加载器是否为null来加载。
Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
//把上面的集合额通过反射 一个个的返回自动配置类的实例。
List<T> instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
AnnotationAwareOrderComparator.sort(instances);
return instances;
}
此图就是SpringFactoriesLoader类中加载自动配置类的路径。
以上就是springboot自动配置的一个过程简单的描述,如果有不对的地方,还请各位大佬指点一二。