SpringBoot原理

SpringBoot最大特點(diǎn):自動裝配

pom.xml

  • spring-boot-dependencies: 核心依賴都在父工程中定義好了荆残,通過spring-boot-starter-parent進(jìn)去鸵赖。
    我們中寫或者引入springBoot依賴的時(shí)候渊额,不需要寫版本號尽纽,因?yàn)槔锩嬉呀?jīng)有了


    spring-boot-starter-parent

啟動器

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-........</artifactId>
        </dependency>
  • 啟動器:就是SpringBoot的啟動場景,比如數(shù)據(jù)庫連接乃坤,消息隊(duì)列等等

注解

@SpringBootApplication//springboot啟動注解苛让,啟動類下面所有的資源被導(dǎo)入,下面有很多子注解
@SpringBootConfiguration//SpringBoot配置注解
@ComponentScan//包掃描注解湿诊,掃描同級及其下面的包注入到應(yīng)用中
@EnableAutoConfiguration//啟用自動配置注解---重要
@AutoConfigurationPackage//自動配置包
@Import({AutoConfigurationImportSelector.class})//導(dǎo)入AutoConfigurationImportSelector類(自動配置選擇類)----重要

AutoConfigurationImportSelector

  public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            //獲取自動配置實(shí)體類
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
 //獲取自動配置實(shí)體類
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            //通過配置文件獲取所有的start啟動器狱杰,返回一個(gè)集合(getCandidateConfigurations)
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
        }
    }
//從字面意思就是獲取獲取候選配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        //通過類名加載自動注入
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        //如果為null,就返回提示厅须,在META-INF / spring.factories中找不到自動配置類仿畸。 如果您使用的是自定義包裝,請確保該文件正確無誤九杂。這就告訴我們 spring.factories非常重要:里面告訴了我們所有的可以自動配置的類颁湖。當(dāng)然我們也可以從loadFactoryNames()方法中的loadSpringFactories()方法知道是從spring.factories匹配類名,然后加載出來的
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
        ClassLoader classLoaderToUse = classLoader;
        if (classLoader == null) {
            classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
        }

        String factoryTypeName = factoryType.getName();
        return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
    }

private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
        Map<String, List<String>> result = (Map)cache.get(classLoader);
        if (result != null) {
            return result;
        } else {
            HashMap result = new HashMap();
            try {
                //獲取資源目錄下面META-INF/spring.factories所有的url
                Enumeration urls = classLoader.getResources("META-INF/spring.factories");
                while(urls.hasMoreElements()) {//有沒有更多的子節(jié)點(diǎn)
                    URL url = (URL)urls.nextElement();
                    UrlResource resource = new UrlResource(url);
                    Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                    Iterator var6 = properties.entrySet().iterator();
                    while(var6.hasNext()) {
                        Entry<?, ?> entry = (Entry)var6.next();
                        String factoryTypeName = ((String)entry.getKey()).trim();
                        String[] factoryImplementationNames = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());
                        String[] var10 = factoryImplementationNames;
                        int var11 = factoryImplementationNames.length;
                        for(int var12 = 0; var12 < var11; ++var12) {
                            String factoryImplementationName = var10[var12];
                            ((List)result.computeIfAbsent(factoryTypeName, (key) -> {
                                return new ArrayList();
                            })).add(factoryImplementationName.trim());
                        }
                    }
                }

                result.replaceAll((factoryType, implementations) -> {
                    return (List)implementations.stream().distinct().collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList));
                });
                //放入到緩存中
                cache.put(classLoader, result);
                return result;
            } catch (IOException var14) {
                throw new IllegalArgumentException("Unable to load factories from location [META-INF/spring.factories]", var14);
            }
        }
    }

結(jié)論: springboot所有自動配置都是在啟動的時(shí)候加載: spring.factories所有的自動配置類都在這里
面例隆,但是不一定生效,要判斷條件是否成立甥捺,只要導(dǎo)入了對應(yīng)的start,就有對應(yīng)的啟動器了镀层,有了啟動器镰禾,我們自動裝配就會生效,然后就配置成功!

  1. springboot在啟動的時(shí)候唱逢,從類路徑下/META-INF/ spring . factories獲取指定的值;
    2.將這些自動配置的類導(dǎo)入容器吴侦,自動配置就會生效,幫我進(jìn)行自動配置!
    3.以前我們需要自動配置的東西,現(xiàn)在springboot幫我們做了!
    4.整合javaEE,解決方案和自動配置的東西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar這個(gè)包下
    5.它會把所有需要導(dǎo)入的組件坞古,以類名的方式返回备韧,這些組件就會被添加到容器;
    6.容器中也會存在非常多的xxAutoConfiguration的文件(@Bean),就是這些類給容器中導(dǎo)入了這個(gè)場景需要
    的所有組件;并自動配置,@Configuration
    7.有了自動配置類痪枫,免去了我們手動編寫配置文件的工作

SpringApplication.run

1.推斷應(yīng)用的類型是普通的項(xiàng)目還是Web項(xiàng)目
2.查找并加載所有可用初始化器织堂,設(shè)置到initializers屬性中
3.找出所有的應(yīng)用程序監(jiān)聽器,設(shè)置到listeners屬性中
4.推斷并設(shè)置main方法的定義類奶陈,找到運(yùn)行的主類

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末易阳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吃粒,更是在濱河造成了極大的恐慌潦俺,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異事示,居然都是意外死亡早像,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門很魂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扎酷,“玉大人,你說我怎么就攤上這事遏匆。” “怎么了谁榜?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵幅聘,是天一觀的道長。 經(jīng)常有香客問我窃植,道長帝蒿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任巷怜,我火速辦了婚禮葛超,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘延塑。我一直安慰自己绣张,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布关带。 她就那樣靜靜地躺著侥涵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宋雏。 梳的紋絲不亂的頭發(fā)上芜飘,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音磨总,去河邊找鬼嗦明。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蚪燕,可吹牛的內(nèi)容都是我干的娶牌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼邻薯,長吁一口氣:“原來是場噩夢啊……” “哼裙戏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厕诡,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤累榜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壹罚,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡葛作,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猖凛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赂蠢。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辨泳,靈堂內(nèi)的尸體忽然破棺而出虱岂,到底是詐尸還是另有隱情,我是刑警寧澤菠红,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布第岖,位于F島的核電站,受9級特大地震影響试溯,放射性物質(zhì)發(fā)生泄漏蔑滓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一遇绞、第九天 我趴在偏房一處隱蔽的房頂上張望键袱。 院中可真熱鬧,春花似錦摹闽、人聲如沸蹄咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽比藻。三九已至,卻和暖如春倘屹,著一層夾襖步出監(jiān)牢的瞬間银亲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工纽匙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留务蝠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓烛缔,卻偏偏與公主長得像馏段,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子践瓷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容