SpringBoot应用启动流程

  介绍

这篇文章主要为大家展示了SpringBoot应用启动流程,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。

<强>前言

SpringBoot应用在启动的时候分为两步:首先生成SpringApplication对象,运行SpringApplication的运行方法、下面一一看一下每一步具体都干了什么

公共静态ConfigurableApplicationContext运行(Class<及# 63;在[]primarySources, String [] args) {
  返回新SpringApplication (primarySources) .run (args);
  }

<>强创建SpringApplication对象

公共SpringApplication (ResourceLoader ResourceLoader Class<及# 63;在…primarySources) {
  这一点。resourceLoader=resourceLoader;
  断言。notNull (primarySources“primarySources不得null");//保存主配置类
  这一点。primarySources=new LinkedHashSet<祝辞(arrays . aslist (primarySources));//判断当前是否一个web应用
  这一点。webApplicationType=WebApplicationType.deduceFromClasspath ();//从类路径下找到meta - inf/spring.factories配置的所有ApplicationContextInitializer,然后保存起来
  setInitializers((集合)getSpringFactoriesInstances (ApplicationContextInitializer.class));//从类路径下找到ETA-INF/spring.factories配置的所有ApplicationListener
  setListeners((集合)getSpringFactoriesInstances (ApplicationListener.class));//从多个配置类中找到有主方法的主配置类
  这一点。mainApplicationClass=deduceMainApplicationClass ();
  }

其中从类路径下获取到meta - inf/spring。工厂配置的所有ApplicationContextInitializer和ApplicationListener的具体代码如下

在)
  */私有静态最终Map<类加载器,MultiValueMap<字符串,String>比;缓存=new ConcurrentReferenceHashMap<在();
  
  私人SpringFactoriesLoader () {
  }/* *
  * AutoConfigurationImportSelector及应用的初始化器和监听器里最终调用的就是这个方法,
  *这里的factoryType是EnableAutoConfiguration.class ApplicationContextInitializer.class,或ApplicationListener.class
  *类加载器是AutoConfigurationImportSelector ApplicationContextInitializer,或ApplicationListener里的beanClassLoader
  */公共静态ListloadFactoryNames (Class<及# 63;比;factoryType @Nullable类加载器类加载器){
  字符串factoryTypeName=factoryType.getName ();
  返回loadSpringFactories(类加载器)。getOrDefault (factoryTypeName Collections.emptyList ());
  }/* *
  *加载spring.factories文件的核心实现
  */私有静态Map<字符串,List比;loadSpringFactories (@Nullable类加载器类加载器){//先从缓存获取,如果获取到了说明之前已经被加载过
  String> MultiValueMap<字符串;结果=cache.get(类加载器);
  如果(结果!=null) {
  返回结果;
  }
  
  尝试{//找到所有jar中的spring.factories文件的地址
  Enumerationurl=(类加载器!=零,# 63;
  classLoader.getResources (FACTORIES_RESOURCE_LOCATION):
  ClassLoader.getSystemResources (FACTORIES_RESOURCE_LOCATION));
  ,结果=new LinkedMultiValueMap<的在();//循环处理每一个spring.factories文件
  而(urls.hasMoreElements ()) {
  网址URL=urls.nextElement ();
  UrlResource资源=new UrlResource (url);//加载spring.factories文件中的内容到属性对象中
  属性的属性=PropertiesLoaderUtils.loadProperties(资源);//遍历spring.factories内容中的所有的键值对
  (Map.Entry<及# 63;,,# 63;比;条目:properties.entrySet ()) {//获得spring.factories内容中关键的(比如org.springframework.boot.autoconfigure.EnableAutoConfiguratio)
  字符串factoryTypeName=((String) entry.getKey ()) .trim ();//获取价值,然后按英文逗号(,)分割得到价值数组并遍历
  (字符串factoryImplementationName: StringUtils.commaDelimitedListToStringArray ((String) entry.getValue ())) {//存储结果到上面的多值映射中(MultiValueMap<字符串,String>)
  结果。add (factoryTypeName factoryImplementationName.trim ());
  }
  }
  }
  缓存。把(类加载器,结果);
  返回结果;
  }
  抓住(IOException ex) {
  把新IllegalArgumentException(“无法加载工厂位置(“+
  FACTORIES_RESOURCE_LOCATION +“]”,前女友);
  }
  }
  }

SpringBoot应用启动流程