欧美国产成人久久精品,中文字幕成人免费视频,国产成人精品一区二区秒拍,亚洲A∨午夜成人片精品网站


學AI,好工作 就找北大青鳥
關注小青 聽課做題,輕松學習
周一至周日
4000-9696-28

你還在用SpringBoot嗎?別人都已經去研究源碼了

來源:北大青鳥總部 2023年01月12日 11:05

摘要: SpringBoot是怎么做到的約定的配置?它配置在了哪里?來一起跟隨源碼探究下SpringBoot到底是如何做到"約定優于配置"的。

我們都知道SpringBoot自問世以來,一直有一個響亮的口號"約定優于配置",其實一種按約定編程的軟件設計范式,目的在于減少軟件開發人員在工作中的各種繁瑣的配置,我們都知道傳統的SSM框架的組合,會伴隨著大量的繁瑣的配置;稍有不慎,就可能各種bug,被人發現還以為我們技術很菜。而SpringBoot的出現不僅大大提高的開發人員的效率,還能避免由于"手抖"帶來的配置錯誤。


很多程序員都感慨SpringBoot的到來大大解放了生產力,但是也有聰明的程序猿會多思考一下下,SpringBoot是怎么做到的約定的配置?它配置在了哪里?又是怎么啟動的作用等等一系列的問號在跟女朋友花前月下的時候,依然會是不是冒出來。這嚴重影響了程序猿們的"幸"福生活,為了能廣大"程序猿"同胞過上幸福美滿的生活,今天咱么就來一起跟隨源碼探究下SpringBoot到底是如何做到"約定優于配置"的。

首先,我們先介紹下我們的演示的項目環境,我們先試用Spring Initializr來創建一個SpirngBoot工程。我們使用的版本是SpringBoot 2.1.5.RELEASE。



接下來就只在pom.xml文件中添加一個web工程的依賴,是為了觀察后面容器類型的源碼。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

這樣我們的環境就準備好了。

我們跟著SpringBoot的源碼來探究它的啟動流程,首先,先找到這個應用程序的入口主方法,在上面打一個斷點



啟動之后,F5進入到run()方法

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

到這里會執行new SpringApplication(primarySources)創建spring應用對象,繼續F5往下跟會執行SpringApplication構造器

// 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));
// 1. 可能的web應用程序類型的類型。
this.webApplicationType = WebApplicationType.deduceFromClasspath();
// 2. 設置初始化應用context
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
// 3.設置初始化監聽
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 4. 推演主程序類
this.mainApplicationClass = deduceMainApplicationClass();
}

很多不為人知的事情都是發生在這個對象初始化的時候,這里我們都來一一解密

static WebApplicationType deduceFromClasspath() {
if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
return WebApplicationType.REACTIVE;
}
for (String className : SERVLET_INDICATOR_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return WebApplicationType.NONE;
}
}
// 這里是我們測試web容器
return WebApplicationType.SERVLET;
}


一、推斷web應用類型

這段代碼是來推斷我們的應用是哪種web應用程序

public enum WebApplicationType {

/**
* The application should not run as a web application and should not start an
* embedded web server.
*/
NONE, // 不是web應用

/**
* The application should run as a servlet-based web application and should start an
* embedded servlet web server.
*/
SERVLET, // servlet容器

/**
* The application should run as a reactive web application and should start an
* embedded reactive web server.
*/
REACTIVE; // 反應型web應用(webflux)

當然一開始我們加入了web的依賴,所以我們是servlet容器,


二、初始化應用上下文

在設置初始化應用context的時候 ,是先執行了`getSpringFactoriesInstances(ApplicationContextInitializer.class)方法,參數是ApplicationContextInitializer.class字節碼對象

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type,
Class<?>[] parameterTypes, Object... args) {
ClassLoader classLoader = getClassLoader();
// Use names and ensure unique to protect against duplicates
Set<String> names = new LinkedHashSet<>(
// 加載ApplicationContextInitializer.class類型的類
// 這里傳入就是參數 ApplicationContextInitializer.clas
SpringFactoriesLoader.loadFactoryNames(type, classLoader));
// 實例化加載到的類
List<T> instances = createSpringFactoriesInstances(type, parameterTypes,
classLoader, args, names);
AnnotationAwareOrderComparator.sort(instances);
// 返回
return instances;
}

public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
return loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
}

我們先來看看他是如何加載到這些類

private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
// 先從緩存中拿
MultiValueMap<String, String> result = cache.get(classLoader);
if (result != null) {
return result;
}
try {
// 去資源路徑下加載
public static final String ACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
Enumeration<URL> urls = (classLoader != null ?
classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION); result = new LinkedMultiValueMap<>();
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
UrlResource resource = new UrlResource(url);
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
for (Map.Entry<?, ?> entry : properties.entrySet()) {
String factoryClassName = ((String) entry.getKey()).trim();
for (String factoryName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) {
result.add(factoryClassName, factoryName.trim());
}
}
}
cache.put(classLoader, result);
// 返回所有的加載的類
return result;
}
catch (IOException ex) {
throw new IllegalArgumentException("Unable to load factories from location [" +
FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}

這里有兩個加載配置類的地方其實都指向了META-INF/spring.factories,通過斷點我們可以看到應用程序是加載了以下幾個jar下的spring.factores文件。

雙擊Shift搜索spring.factories可以看到它存在于以下工程中



spring-boot-2.1.5.RELEASE.jar下的spring.factores(截圖未完整截取)



spring-boot-autoconfigure-2.1.5.RELEASE.jar下的spring.factores



spring-beans-5.1.7.RELEASE.jar下的spring.factores



從Map中根據org.springframework.context.ApplicationContextInitializer的類型拿到需要的類初始化類,斷點進入getOrDefault(factoryClassName, Collections.emptyList());方法



之后就是把加載到的需要初始化的類進行實例化添加到一個集合中等待備用

public void setInitializers(
Collection<? extends ApplicationContextInitializer<?>> initializers) {
this.initializers = new ArrayList<>();
this.initializers.addAll(initializers);
}


三、初始化監聽器類

最關鍵的的還是這句



當我們跟進去之后,會發現在初始化監聽類的時候和上面初始化應用上下文是一樣的代碼。唯一不同的是getSpringFactoriesInstances(ApplicationListener.class))傳進去的是·ApplicationListener.class所以這里就不再贅述。


四、推演主程序類

也就是這個最關鍵的代碼了

this.mainApplicationClass = deduceMainApplicationClass();




到這里就完成了SpringBoot啟動過程中初始化SpringApplication的過程。


小結

這篇文章主要是給大家說了下SpringBoot啟動過程中初始化SpringApplication的流程,大致可以分為四個步驟:

推演web應用的類型(如果沒有加web依賴類型NONE)

初始化ApplicationContextInitializer

初始化ApplicationListener

推演出主程序類

通過這樣四個步驟就完成了第一步SpringApplication的初始化過程。


標簽: springboot
熱門班型時間
人工智能就業班 即將爆滿
AI應用線上班 即將爆滿
UI設計全能班 即將爆滿
數據分析綜合班 即將爆滿
軟件開發全能班 爆滿開班
網絡安全運營班 爆滿開班
報名優惠
免費試聽
課程資料
官方微信
返回頂部
培訓課程 熱門話題 站內鏈接
欧美国产成人久久精品,中文字幕成人免费视频,国产成人精品一区二区秒拍,亚洲A∨午夜成人片精品网站
  • <span id="i8q4c"></span>

  • <center id="i8q4c"><optgroup id="i8q4c"></optgroup></center>

    • gogogo免费视频观看亚洲一| 国模一区二区三区白浆| 精品在线视频一区| 国模大尺度一区二区三区| 国产成人8x视频一区二区 | 韩国精品久久久| 国产成人综合亚洲91猫咪| 97精品国产97久久久久久久久久久久| 丝袜a∨在线一区二区三区不卡| 美女免费视频一区二区| 成人网页在线观看| 久久99国产精品久久99果冻传媒| 成人一级视频在线观看| 久久精品国产精品青草| 99久久精品免费观看| 久久99久久99小草精品免视看| 国产不卡在线一区| 久久精品国产精品亚洲精品| 97se亚洲国产综合自在线| 久久精品国产99国产精品| 不卡一区二区三区四区| 理论片日本一区| eeuss国产一区二区三区| 激情综合色播激情啊| 国产精品99久久久久久有的能看| 激情图片小说一区| 毛片一区二区三区| 天堂资源在线中文精品| 久久99热这里只有精品| 日韩激情av在线| av不卡免费在线观看| 国产精品一区二区x88av| 秋霞国产午夜精品免费视频| 福利电影一区二区| 极品尤物av久久免费看| 日韩avvvv在线播放| 99久久久久久| jiyouzz国产精品久久| 国产精品一区二区不卡| 国产盗摄女厕一区二区三区| 精品一区二区三区的国产在线播放 | 狠狠色狠狠色合久久伊人| 国产成人免费在线观看| 理论片日本一区| 91玉足脚交白嫩脚丫在线播放| 国产一区二区久久| 激情文学综合丁香| 精品中文字幕一区二区| 美女一区二区视频| 男女男精品网站| 日本麻豆一区二区三区视频| 日韩国产精品91| 日韩中文字幕区一区有砖一区 | 久久精品国产精品青草| 美女视频黄频大全不卡视频在线播放 | 不卡av在线网| 成人黄页在线观看| 99精品视频一区| 91在线国产福利| 日本亚洲视频在线| 久久99国产精品久久| 激情久久五月天| 国产精品一区二区久久不卡| 国产白丝网站精品污在线入口 | 成人综合在线网站| a亚洲天堂av| 肉丝袜脚交视频一区二区| 日本sm残虐另类| 久久66热偷产精品| 国产精品一区二区在线观看网站| 国产成人av电影在线播放| 99久久久精品| 日本欧美一区二区三区乱码| 国产一区二区在线电影| 国产 日韩 欧美大片| 99国产精品久| 久久精品99国产国产精| 国产成人av资源| 日韩高清中文字幕一区| 国产乱对白刺激视频不卡| www.欧美日韩国产在线| 麻豆精品在线观看| 处破女av一区二区| 久久er99热精品一区二区| 成人久久18免费网站麻豆| 欧美aaa在线| 国产高清视频一区| 日本系列欧美系列| 国产精品12区| 日本aⅴ精品一区二区三区 | 国产乱码精品一区二区三区av | 男女激情视频一区| 东方欧美亚洲色图在线| 美女一区二区三区| 不卡高清视频专区| 看电视剧不卡顿的网站| caoporen国产精品视频| 国产一区二区三区免费观看| 视频一区在线播放| 国产成人免费在线| 激情深爱一区二区| 91麻豆文化传媒在线观看| 国产又黄又大久久| 日本中文字幕不卡| 成人a区在线观看| 精品一区二区日韩| 91在线视频免费91| 国产精选一区二区三区| 日韩专区欧美专区| 成a人片国产精品| 国产盗摄精品一区二区三区在线 | 美女网站视频久久| 日韩成人av影视| 顶级嫩模精品视频在线看| 国产又粗又猛又爽又黄91精品| 日韩av在线播放中文字幕| jiyouzz国产精品久久| 岛国av在线一区| 国产91精品入口| 国产精品99久久久久| 紧缚奴在线一区二区三区| 麻豆精品在线视频| 免费成人美女在线观看| 日韩二区三区四区| 日日摸夜夜添夜夜添精品视频 | 美女任你摸久久| 日韩电影免费在线看| 99精品视频中文字幕| 波多野结衣中文字幕一区二区三区| 国产精品99久久久久久久vr| 国模娜娜一区二区三区| 国产九色精品成人porny | 国产一区二区三区观看| 国内精品免费**视频| 国产麻豆精品视频| 国产福利一区二区三区| 国产精品亚洲午夜一区二区三区 | 国产69精品久久久久777| 成人综合在线视频| 成人一区二区视频| 成人免费视频免费观看| 成人午夜av电影| 99v久久综合狠狠综合久久| 91免费版在线| 麻豆精品视频在线| 国产高清视频一区| 91老师国产黑色丝袜在线| 日韩av一区二区三区| 麻豆91精品视频| 国产综合久久久久影院| 国产精品综合久久| 99久久精品99国产精品| 99在线视频精品| 99久久综合国产精品| va亚洲va日韩不卡在线观看| 免费看欧美女人艹b| 国内精品久久久久影院色| 国产精品自在欧美一区| 播五月开心婷婷综合| 青青青伊人色综合久久| 国产福利一区在线| 青草国产精品久久久久久| 久久 天天综合| 成人免费视频app| 日韩电影在线免费观看| 狠狠色狠狠色综合日日91app| 丁香天五香天堂综合| 蜜臀av亚洲一区中文字幕| 日韩精品成人一区二区三区| 男人的j进女人的j一区| 成人在线视频一区| 韩国一区二区三区| 91网站最新网址| 国产麻豆精品在线观看| 日韩av在线免费观看不卡| 国产在线精品免费| 不卡视频免费播放| 国产麻豆精品视频| 奇米精品一区二区三区在线观看一 | 另类综合日韩欧美亚洲| 国产不卡在线视频| 日韩国产在线观看| 国产精品 欧美精品| 天堂资源在线中文精品 | 爽好多水快深点欧美视频| 久久99久久久久久久久久久| av不卡在线观看| 国产精品综合在线视频| 久久精品99国产精品| 91麻豆6部合集magnet| 国精产品一区一区三区mba视频 | 91麻豆国产香蕉久久精品| 理论电影国产精品| 日韩成人午夜电影| 99久久99久久精品免费看蜜桃| 久久99国产精品久久99| 日日摸夜夜添夜夜添亚洲女人| 国产成人综合网| 狠狠色丁香婷婷综合| 91视频一区二区三区| 成人国产免费视频| 国产成人精品1024| 毛片一区二区三区| 全国精品久久少妇| 日本欧美久久久久免费播放网| 高清不卡一区二区在线| 国产精品2024| 九九视频精品免费| 久久精品国产网站| 麻豆免费看一区二区三区| 青青草国产成人99久久| 青青草国产精品97视觉盛宴| 蜜臀久久99精品久久久久久9| 91丝袜国产在线播放| av在线播放一区二区三区| 成人综合婷婷国产精品久久蜜臀| 国产成人高清在线| 不卡电影一区二区三区| 91丨九色porny丨蝌蚪| 成人永久aaa| av不卡一区二区三区| 91丨九色丨蝌蚪丨老版| 青青草原综合久久大伊人精品优势| 轻轻草成人在线| 久久精品国产99久久6| 国产一区在线精品| 成人永久免费视频| 91日韩精品一区| 日本午夜精品一区二区三区电影| 另类欧美日韩国产在线| 国产精品1024| 99国产欧美久久久精品| 蜜桃av一区二区三区电影| 老司机午夜精品| 国产成人综合精品三级| 成人av电影在线播放| 不卡的av电影在线观看| 美国毛片一区二区| 成人免费三级在线| 日本vs亚洲vs韩国一区三区 | 91麻豆国产香蕉久久精品| 麻豆成人久久精品二区三区小说| 国产一区二区三区观看| 99re热这里只有精品视频| 美女性感视频久久| 床上的激情91.| 美女视频免费一区| 成人短视频下载| 日本欧美一区二区| 国产ts人妖一区二区| 91免费国产在线观看| 国内成人精品2018免费看| 国产精品一区一区三区| 肉丝袜脚交视频一区二区| 国产精品正在播放| 视频一区二区国产| 国产一区二区精品在线观看| 日韩精品亚洲一区| 国产美女在线精品| 三级一区在线视频先锋| 国产成人av在线影院| 久久精品国产亚洲a| 99re视频精品| 国产在线精品一区二区夜色 | 九九在线精品视频| 91视频一区二区| 国产精品一区二区男女羞羞无遮挡| 成人av先锋影音| 国产乱色国产精品免费视频| 日韩电影免费在线观看网站| www.欧美精品一二区| 热久久一区二区| 成人毛片在线观看| 国产精品18久久久久久久久久久久| 日本成人中文字幕在线视频| 国产精品1区2区3区| 激情综合色丁香一区二区| www.欧美日韩| 国产成人自拍在线| 国产精品99久久久久久似苏梦涵 | 日韩二区三区四区| 99久免费精品视频在线观看| 国产成人av网站| 国产高清成人在线| 久久se精品一区二区| 青青草精品视频| 91一区一区三区| 天堂久久久久va久久久久| 麻豆91小视频| 日本女优在线视频一区二区| 日韩成人一区二区| 日av在线不卡| 麻豆成人91精品二区三区| 免费av成人在线| 日本vs亚洲vs韩国一区三区二区 | 韩国成人在线视频| 黄页视频在线91| 秋霞午夜鲁丝一区二区老狼| 日韩av电影免费观看高清完整版| 91蝌蚪porny| 日本视频在线一区| 另类小说综合欧美亚洲| 捆绑调教美女网站视频一区| 另类专区欧美蜜桃臀第一页| 久久99精品国产麻豆婷婷洗澡| 91免费小视频| 成人成人成人在线视频| 国产精品99久| 成人高清视频在线观看| 日日噜噜夜夜狠狠视频欧美人| 日日夜夜免费精品| 九色porny丨国产精品| 国产精品伊人色| 不卡一区二区在线| 三级在线观看一区二区| 九色综合狠狠综合久久| 国产精品99久久久久久久vr| www.亚洲色图.com| 三级欧美韩日大片在线看| 久久99精品久久久久| 国产xxx精品视频大全| 99国产精品久久久久久久久久| 日日夜夜精品免费视频| 精品一区二区精品| 国产成人精品三级| 日韩黄色小视频| 精品一区二区三区免费播放| 国产成a人亚洲| 国产专区综合网| 99久久综合国产精品| 免费日本视频一区| 国产成人h网站| 日本欧美加勒比视频| 麻豆成人在线观看| 国产不卡在线播放| 美女一区二区久久| 国产91精品入口| 免费在线看成人av| 成人美女在线观看| 丝袜国产日韩另类美女| 国产精品自拍网站| 99热精品国产| 九九**精品视频免费播放| www.色精品| 国产精品一区二区久久精品爱涩| 日韩电影一区二区三区四区| 岛国av在线一区| 美女精品自拍一二三四| 国产在线精品一区二区不卡了 | 美女精品自拍一二三四| 国产精品一品二品| 日韩高清国产一区在线| 国产精品456| 秋霞影院一区二区| 99re免费视频精品全部| 国产精品一区在线观看乱码| 久久精品国产一区二区三 | 日本视频免费一区| 国产精品影视网| 久久精品国产网站| 日韩精品一级二级 | 懂色av一区二区三区免费看| 日韩国产精品大片| 99免费精品在线观看| 成人h动漫精品| 国产在线精品一区在线观看麻豆| 日韩成人午夜电影| 日韩中文字幕麻豆| 99国产精品久久久久久久久久| 成人精品国产免费网站| 国产精品综合在线视频| 狠狠狠色丁香婷婷综合激情| 日韩精品电影在线| 日本免费新一区视频| 日韩二区三区在线观看| 9人人澡人人爽人人精品| 成人在线视频首页| 成人免费视频caoporn| 国产不卡视频在线观看| 国产a级毛片一区| 国产一区91精品张津瑜| 免费成人美女在线观看| 蜜臀久久久久久久| 精品一区二区三区香蕉蜜桃| 久久9热精品视频| 喷水一区二区三区| 免费在线观看不卡| 激情成人午夜视频| 国产精品综合av一区二区国产馆| 国产精品综合av一区二区国产馆| 国产精品一区二区三区乱码| 国产成人久久精品77777最新版本| 国产一区 二区 三区一级| 国产99久久久精品| caoporen国产精品视频| 97久久精品人人澡人人爽| 三级不卡在线观看| 麻豆一区二区三区| 国内外成人在线视频| 国内外成人在线|