SpringApplication初始化
今天开始看下springboot的代码流程,springboot给我的印象就是代码少,做的事不少啊,由于流程比较多,所以会分段介绍
1、springboot标准启动入口
进入run方法,首先就是初始化SpringApplication对象,其中souces就是入口类ConfigApplication
2、调用SpringApplication构造方法
进入initialize方法,主要就是给SpringApplication的5个属性进行赋值
private final Set sources = new LinkedHashSet()
private boolean webEnvironment;
private List<ApplicationContextInitializer<?>> initializers
private List<ApplicationListener<?>> listeners;
private Class<?> mainApplicationClass;
-
sources:直接赋值的是ConfigApplication的Class对象
-
webEnvironment:是否是web环境,进行了推断
如上图可知,推断的标准就是系统中是否有Servlet 和 ConfigurableWebApplicationContext -
initializers和listeners:这两个集合的赋值采用了同一个方法getSpringFactoriesInstances(获取spring.factories文件中的实例)
001、加载properties
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
//获取className
String factoryClassName = factoryClass.getName();
try {
//加载spring.factories文件
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
ArrayList result = new ArrayList();
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
//根据文件所在的地址url创建资源,并使用工具类加载资源
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
//properties的api获取val
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
} catch (IOException var8) {
}
}
简单的看下这个spring.factories文件
002、创建对象,这时我们已经获取的Class了,使用反射可以创建对象
…
T instance = (T) BeanUtils.instantiateClass(constructor, args);
- mainApplicationClass :当前入口类的Class
至此,SpringApplication初始化完成,进行了属性的初始赋值