介绍
这篇文章主要为大家展示了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文件的地址 Enumeration url=(类加载器!=零,# 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应用启动流程