日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot應用啟動流程源碼解析

瀏覽:25日期:2023-05-23 17:00:16

前言

Springboot應用在啟動的時候分為兩步:首先生成 SpringApplication 對象 ,運行 SpringApplication 的 run 方法,下面一一看一下每一步具體都干了什么

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args); }

創建 SpringApplication 對象

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { this.resourceLoader = resourceLoader; Assert.notNull(primarySources, 'PrimarySources must not be null'); //保存主配置類 this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); //判斷當前是否一個web應用 this.webApplicationType = WebApplicationType.deduceFromClasspath(); //從類路徑下找到META-INF/spring.factories配置的所有ApplicationContextInitializer;然后保存起來 setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); //從類路徑下找到ETA-INF/spring.factories配置的所有ApplicationListener  setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); //從多個配置類中找到有main方法的主配置類  this.mainApplicationClass = deduceMainApplicationClass(); }

其中從類路徑下獲取到META-INF/spring.factories配置的所有ApplicationContextInitializer和ApplicationListener的具體代碼如下

public final class SpringFactoriesLoader { /**spring.factories的位置*/ public static final String FACTORIES_RESOURCE_LOCATION = 'META-INF/spring.factories'; private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class); /** * 緩存掃描后的結果, 注意這個cache是static修飾的,說明是多個實例共享的 * 其中MultiValueMap的key就是spring.factories中的key(比如org.springframework.boot.autoconfigure.EnableAutoConfiguration), * 其值就是key對應的value以逗號分隔后得到的List集合(這里用到了MultiValueMap,他是guava的一鍵多值map, 類似Map<String, List<String>>) */ private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap<>(); private SpringFactoriesLoader() { } /** * AutoConfigurationImportSelector及應用的初始化器和監聽器里最終調用的就是這個方法, * 這里的factoryType是EnableAutoConfiguration.class、ApplicationContextInitializer.class、或ApplicationListener.class * classLoader是AutoConfigurationImportSelector、ApplicationContextInitializer、或ApplicationListener里的beanClassLoader */ public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) { String factoryTypeName = factoryType.getName(); return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList()); } /** * 加載 spring.factories文件的核心實現 */ private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) { // 先從緩存獲取,如果獲取到了說明之前已經被加載過 MultiValueMap<String, String> result = cache.get(classLoader); if (result != null) { return result; } try { // 找到所有jar中的spring.factories文件的地址 Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); result = new LinkedMultiValueMap<>(); // 循環處理每一個spring.factories文件 while (urls.hasMoreElements()) {URL url = urls.nextElement();UrlResource resource = new UrlResource(url);// 加載spring.factories文件中的內容到Properties對象中Properties properties = PropertiesLoaderUtils.loadProperties(resource);// 遍歷spring.factories內容中的所有的鍵值對for (Map.Entry<?, ?> entry : properties.entrySet()) { // 獲得spring.factories內容中的key(比如org.springframework.boot.autoconfigure.EnableAutoConfiguratio) String factoryTypeName = ((String) entry.getKey()).trim(); // 獲取value, 然后按英文逗號(,)分割得到value數組并遍歷 for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) { // 存儲結果到上面的多值Map中(MultiValueMap<String, String>) result.add(factoryTypeName, factoryImplementationName.trim()); }} } cache.put(classLoader, result); return result; } catch (IOException ex) { throw new IllegalArgumentException('Unable to load factories from location [' + FACTORIES_RESOURCE_LOCATION + ']', ex); } }}

運行run方法

public ConfigurableApplicationContext run(String... args) {//開始停止的監聽 StopWatch stopWatch = new StopWatch(); stopWatch.start();//聲明一個可配置的ioc容器 ConfigurableApplicationContext context = null; FailureAnalyzers analyzers = null; //配置awt相關的東西 configureHeadlessProperty(); //獲取SpringApplicationRunListeners;從類路徑下META-INF/spring.factories SpringApplicationRunListeners listeners = getRunListeners(args); //回調所有的獲取SpringApplicationRunListener.starting()方法 listeners.starting(); try { //封裝命令行參數 ApplicationArguments applicationArguments = new DefaultApplicationArguments( args); //準備環境 ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); //創建環境完成后回調SpringApplicationRunListener.environmentPrepared();表示環境準備完成 Banner printedBanner = printBanner(environment);//創建ApplicationContext;決定創建web的ioc還是普通的ioc,//通過反射創建ioc容器((ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass);) context = createApplicationContext(); //出現異常之后做異常分析報告 analyzers = new FailureAnalyzers(context); //準備上下文環境;將environment保存到ioc中;而且applyInitializers(); //applyInitializers():回調之前保存的所有的ApplicationContextInitializer的initialize方法 //回調所有的SpringApplicationRunListener的contextPrepared(); // prepareContext(context, environment, listeners, applicationArguments, printedBanner); //prepareContext運行完成以后回調所有的SpringApplicationRunListener的contextLoaded();//刷新容器;ioc容器初始化(如果是web應用還會創建嵌入式的Tomcat);Spring注解版 //掃描,創建,加載所有組件的地方;(配置類,組件,自動配置) refreshContext(context); //從ioc容器中獲取所有的ApplicationRunner和CommandLineRunner進行回調 //ApplicationRunner先回調,CommandLineRunner再回調 afterRefresh(context, applicationArguments); //所有的SpringApplicationRunListener回調finished方法 listeners.finished(context, null); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch); } //整個SpringBoot應用啟動完成以后返回啟動的ioc容器; return context; } catch (Throwable ex) { handleRunFailure(context, listeners, analyzers, ex); throw new IllegalStateException(ex); }}

幾個重要的事件回調機制

配置在META-INF/spring.factories

ApplicationContextInitializer

SpringApplicationRunListener

只需要放在ioc容器中

ApplicationRunner

CommandLineRunner

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久福利在线| yellow在线观看网址| 天堂√中文最新版在线| 国产成人精品一区二区三区在线| 国际精品欧美精品| 日韩欧美二区| 欧美日韩国产综合网| 亚洲影院天堂中文av色| 97精品国产99久久久久久免费| 欧美三区不卡| 麻豆精品久久| 国产在线|日韩| 国产精品普通话对白| 四虎精品永久免费| 久久只有精品| 亚洲福利国产| 石原莉奈一区二区三区在线观看 | 韩日一区二区| 亚洲国产专区| 日韩国产91| 98精品视频| 欧美日韩视频| 国产精品成人3p一区二区三区| av综合电影网站| 亚洲资源网站| 日本久久精品| 视频一区二区三区在线| 欧美激情 亚洲a∨综合| 久久九九精品| 日韩黄色av| 国产一区二区三区久久久久久久久| 午夜精品一区二区三区国产| 人人爱人人干婷婷丁香亚洲| 日韩国产激情| 玖玖精品视频| av在线最新| 亚州av日韩av| 婷婷激情久久| 毛片不卡一区二区| 在线视频精品| 蜜桃久久久久| 蜜桃一区二区三区在线| 天堂中文av在线资源库| 91精品国产自产观看在线| 欧美美女一区| 国产精品v亚洲精品v日韩精品| 亚洲午夜在线| 精品国产乱码久久久久久1区2匹| 麻豆9191精品国产| 日韩电影免费网址| 国产日产精品_国产精品毛片 | 色婷婷精品视频| 中文字幕亚洲精品乱码| 日韩av免费大片| 久久激五月天综合精品| 国产精品毛片| 国产尤物精品| 桃色av一区二区| 精品入口麻豆88视频| 日本成人中文字幕| 亚洲综合不卡| 欧美va天堂| 日韩国产欧美一区二区| 久久不见久久见国语| 日韩区欧美区| 久久99伊人| 99pao成人国产永久免费视频| 麻豆国产精品777777在线| 午夜性色一区二区三区免费视频| 黑丝美女一区二区| 视频福利一区| 欧美亚洲日本精品| 麻豆精品在线播放| 国产精品主播| 国产欧美日韩综合一区在线播放| 日韩不卡一区二区三区 | 国产精品毛片在线看| 激情综合在线| 亚洲国产专区校园欧美| 中文字幕在线看片| 日产精品一区二区| 国产精品久久观看| 欧美国产偷国产精品三区| 精品欠久久久中文字幕加勒比| 国产精品美女午夜爽爽| 国产精品永久| 国产精品videosex极品| 国产成人精选| 色黄视频在线观看| 久久一区国产| 中文在线а√在线8| 成人综合一区| 日韩在线观看一区| 久久精品国产大片免费观看| av高清一区| 精品免费av在线| 99久久激情| 国产亚洲永久域名| 日本亚洲欧美天堂免费| 日韩av资源网| 国产精品入口久久| 水蜜桃精品av一区二区| 在线一区视频观看| 妖精视频成人观看www| 亚洲视频电影在线| 国产无遮挡裸体免费久久| 麻豆久久一区| 国产麻豆久久| 国产视频欧美| 亚洲美女91| 国产精品宾馆| 日韩欧美不卡| 蜜桃一区二区三区在线| 国产麻豆一区| 日韩在线看片| 免费的成人av| 免费日韩一区二区三区| av在线日韩| 丝袜脚交一区二区| 国产精品一区二区av日韩在线| 日韩1区在线| 在线成人直播| 青青草伊人久久| 日韩黄色大片| 亚洲一区二区免费看| 国产精品最新自拍| 韩国精品主播一区二区在线观看| 爽爽淫人综合网网站| 欧美亚洲二区| 蜜桃精品在线| 日韩精品乱码av一区二区| 成人在线视频免费| 丝袜美腿亚洲色图| 国产精品99在线观看| 鲁大师影院一区二区三区| 国产精品久久久久av蜜臀| 久久天堂av| 日韩午夜视频在线| 桃色av一区二区| 日本伊人久久| 日韩一区二区在线免费| 亚久久调教视频| 播放一区二区| 国产精品久av福利在线观看| 精品欧美久久| 麻豆成人91精品二区三区| 亚洲黄页一区| 精品国产91| 1024精品一区二区三区| 国产欧美成人| 国产亚洲毛片在线| 国产乱码午夜在线视频| 四虎精品一区二区免费| 91精品一区国产高清在线gif | 欧美日韩国产亚洲一区| 国产精品www.| 尤物在线精品| 亚洲午夜天堂| 青草综合视频| 久久午夜精品一区二区| 欧美日韩视频网站| 国产欧美69| 亚洲深深色噜噜狠狠爱网站| 国产一区视频在线观看免费| 美女精品视频在线| 色8久久久久| 日韩精品欧美激情一区二区| 国产精品免费99久久久| 视频一区日韩精品| 视频一区中文字幕| 婷婷国产精品| 日韩精品第一区| 国产a久久精品一区二区三区| 日本a级不卡| 亚洲网址在线观看| 99re国产精品| 午夜久久免费观看| 欧美中文字幕一区二区| 丝袜诱惑一区二区| 激情综合五月| 国产精品男女| 国产亚洲观看| 日韩高清不卡一区| 亚洲精品麻豆| 免费久久99精品国产| 中文日韩欧美| 欧美日韩视频| 红桃视频亚洲| 欧美日韩国产综合网| 黄色成人91| 国产毛片一区| 亚洲女人av| 久久国产成人| 午夜在线视频观看日韩17c| 91久久黄色| 快she精品国产999| 在线亚洲免费| 日韩精品一二三四| 伊人久久亚洲| 日韩毛片网站|