開啟Spring Boot 之旅

開啟Spring Boot 之旅

1器赞、Spring Boot 簡(jiǎn)介

簡(jiǎn)化Spring應(yīng)用開發(fā)的一個(gè)框架港柜;

整個(gè)Spring技術(shù)棧的一個(gè)大整合咳榜;

JavaEE開發(fā)的一站式解決方案涌韩。

2、微服務(wù)

Martion Fowler 的一篇長(zhǎng)長(zhǎng)的文章https://martinfowler.com/microservices/ 释树,2014;雖然他不是微服務(wù)提出者嘴拢,但是他的這篇文章卻明確定義說明了什么是微服務(wù)寂纪。

微服務(wù):架構(gòu)風(fēng)格

一個(gè)應(yīng)用應(yīng)該是一組小型服務(wù)捞蛋;可以通過HTTP的的方式進(jìn)行溝通。

  • 單體應(yīng)用(非微服務(wù)) ALL IN ONE

    所有的東西都寫在一個(gè)應(yīng)用里面庄涡。開發(fā)一個(gè) OA CRM ERP 等系統(tǒng)穴店,一個(gè)應(yīng)用打包成war包放在tomcat等服務(wù)器上直接運(yùn)行拿穴。開發(fā)測(cè)試簡(jiǎn)單默色,部署也簡(jiǎn)單。擴(kuò)展也簡(jiǎn)單缘厢。負(fù)載不行的話义钉,復(fù)制十幾份相同的應(yīng)用放在十幾個(gè)服務(wù)器上捶闸,通過負(fù)載均衡機(jī)制來提高我們的并發(fā)能力删壮。

    問題就是:牽一發(fā)而動(dòng)全身 ;項(xiàng)目越大問題越多税灌。

  • 微服務(wù)

    微服務(wù).PNG

    )

    每一個(gè)功能元素最終都是一個(gè)可獨(dú)立替換和獨(dú)立升級(jí)的軟件單元菱涤;

    詳細(xì)參閱:中文文檔 (martinfowler文章的翻譯( ̄▽ ̄)*( ̄▽ ̄)*)

  • 構(gòu)建大型分布式應(yīng)用

    服務(wù)微化帶來的就是大型分布式的應(yīng)用粘秆,面對(duì)如此大型的分布式應(yīng)用我們?cè)撊绾螛?gòu)建應(yīng)用spring的官方網(wǎng)站一個(gè)經(jīng)典的示意圖給了我們思路收毫,首先利用Spring Boot 快速構(gòu)建應(yīng)用此再。利用Spring Cloud進(jìn)行分布式的網(wǎng)狀互聯(lián)互調(diào)输拇。利用SpringCloud Date Flow 在分布式中間進(jìn)行流式數(shù)據(jù)計(jì)算于批處理。

3议慰、Spring Boot Quirk Start

  • https://start.spring.io/

    利用Spring Initializr.快速構(gòu)建一個(gè)Spring Boot 項(xiàng)目奴曙。 或者使用Spring官方的集成開發(fā)環(huán)境 STS 、以及IntelliJ IDEA 等工具進(jìn)行快速構(gòu)建Spring Boot項(xiàng)目炉菲。

  • 通過Spring Initiallizr 會(huì)自動(dòng)為我們生成如下的目錄結(jié)構(gòu):

    |-demo

    ? |-src

    ? |-main

    ? |-java

    ? |-com.example.demo

    ? |-DemoApplication.java //啟動(dòng)類

    ? |-resources

    ? |-static //放置靜態(tài)資源

    ? |-templates //前端模板

    ? |-application.properties //配置文件

    ? |-test

    ? |-java

    ? |-com.example.demo

    ? |-DemoApplicationTests.java //測(cè)試啟動(dòng)類

    ? |-target //程序打包后會(huì)在這里?

4 堕战、Spring Boot 啟動(dòng)類

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @SpringBootApplication 來、標(biāo)注一個(gè)主程序類越驻,來說明這是一個(gè)Spring Boot 應(yīng)用
 */
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        //Spring應(yīng)用啟動(dòng)起來
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplication:Spring Boot應(yīng)用標(biāo)注在這個(gè)類上說明這個(gè)類是Spring Boot的主配置類缀旁,

Spring Boot就應(yīng)該運(yùn)行這個(gè)類的main方法來啟動(dòng)Spring Boot應(yīng)用并巍,這個(gè)注解點(diǎn)開如下:


@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

@SpringBootConfiguration: Spring Boot 的配置類懊渡;

? 標(biāo)注在摸個(gè)類上表示這是一個(gè) Spring Boot 的配置類剃执,他點(diǎn)開下面有個(gè)@Configuration注解

? @Configuration: 配置類上來標(biāo)注這個(gè)注解肾档;

? 配置類----對(duì)應(yīng)-----配置文件;<u>配置類也是容器中的一個(gè)組件 @Component</u>

?

@EnableAutoConfiguration:開啟自動(dòng)配置功能

? 以前我們需要自己配置東西骇两,而Spring Boot 幫我們自動(dòng)配置低千;@EnableAutoConfiguration 添加在配置類上示血,自動(dòng)配置才能生效救拉。他點(diǎn)開亿絮,你面是一個(gè)@AutoConfigurationPackage與@Import的組合注解:

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

@AutoConfigurationPackage:自動(dòng)配置包的注解

@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {

? Spring的底層注解@Import黔姜,給容器中導(dǎo)入一個(gè)組件秆吵;導(dǎo)入的組件由AutoConfigurationPackages.==Registrar==.class 來指定纳寂。來看該類下的這個(gè)方法:

public void registerBeanDefinitions(AnnotationMetadata metadata,
                                    BeanDefinitionRegistry registry) {
    register(registry, new PackageImport(metadata).getPackageName());
}

我們debug一下:

debug.PNG

從結(jié)果來看黔牵,@AutoConfigurationPackage注解就是將主配置類(@SpringBootApplication所標(biāo)注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器猾浦。

@Import({org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.class})

給容器導(dǎo)入組件的作用金赦,導(dǎo)入什么樣的組件夹抗?

AutoConfigurationImportSelector:導(dǎo)入哪些組件的選擇器漠烧,進(jìn)入該類我們來看一個(gè)方法:

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    }
    AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
        .loadMetadata(this.beanClassLoader);
    AnnotationAttributes attributes = getAttributes(annotationMetadata);
    List<String> configurations = getCandidateConfigurations(annotationMetadata,
                                                             attributes);
    configurations = removeDuplicates(configurations);
    Set<String> exclusions = getExclusions(annotationMetadata, attributes);
    checkExcludedClasses(configurations, exclusions);
    configurations.removeAll(exclusions);
    configurations = filter(configurations, autoConfigurationMetadata);
    fireAutoConfigurationImportEvents(configurations, exclusions);
    return StringUtils.toStringArray(configurations);
}

debug一下:

AutoConfiguration

如圖通殃,結(jié)果加所有需要導(dǎo)入的組件以全類名的方式返回画舌,這些組件就會(huì)被添加到容器中曲聂;

會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(xxxAutoConfiguration):給容器中導(dǎo)入這個(gè)場(chǎng)景所需要的所有組件朋腋,并配置好這些組件,免去了我們手寫配置注入功能組件等的工作把将。

List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

參數(shù) EnableAutoConfiguration.class,classloader

Spring Boot 在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取到EnableAutoConfiguration指定的值洽议;將這些值作為自動(dòng)配置類導(dǎo)入到容器中亚兄,自動(dòng)配置類就生效了审胚。

而實(shí)際上Spring底層的配置一個(gè)都不能少膳叨,只不過這些自動(dòng)配置幫我們做了。

JavaEE的整體整合解決方案和自動(dòng)配置都在:spring-boot-autoconfigure-2.0.4.RELEASE.jar中

截圖

5、POM.xml文件

1健田、父項(xiàng)目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

他是所用spring-boot-starter的父項(xiàng)目抄课。而他打開后间聊,他的父項(xiàng)目是:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

↗他來真正的管理Spring Boot應(yīng)用里面的所有依賴版本

↗即型豁,Spring Boot 的版本仲裁中心:

so迎变,我們?cè)赟pring Boot 中導(dǎo)入的依賴驼侠,默認(rèn)是不需要寫版本的倒源,spring-boot-dependencies中為我們進(jìn)行了依賴版本的管理「烀【而沒有在spring-boot-dependencies中進(jìn)行依賴版本聲明的自然需要寫版本了】。

2、導(dǎo)入依賴
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

spring-boot-starter-web:

spring-boot-starter: Spring Boot的場(chǎng)景啟動(dòng)器

spring-boot-starter-web:幫我們導(dǎo)入web模塊正常運(yùn)行所依賴的組件,當(dāng)然以來的版本都受父項(xiàng)目仲裁妥粟。

Spring Boot將所有的功能場(chǎng)景都抽取出來,做成一個(gè)個(gè)的starters(啟動(dòng)器)播急,只需要在項(xiàng)目中引入這些starter,相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來握截。要用什么功能基因?qū)胧裁磮?chǎng)景的啟動(dòng)器。詳細(xì)參考畜眨,Spring Boot的幫助文檔 頁面搜索starter。來查看各種場(chǎng)景的啟動(dòng)器恬汁,以及他們所導(dǎo)入的各種依賴。

3、部署相關(guān)
<!--將應(yīng)用打包成一個(gè)可執(zhí)行的jar包-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
4、其他雜項(xiàng)
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>demo</name>
<description>Demo project for Spring Boot</description>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

↗包含包名、項(xiàng)目名贪婉、版本、打包類型尤蒿、名稱竣贪、描述、以及編碼、JDK版本的配置信息拍皮。

6、啟動(dòng)spring boot 項(xiàng)目的三種方式

  1. ide中直接啟動(dòng)

  2. cmd 進(jìn)入項(xiàng)目目錄鍵入 mvn spring-boot:run來啟動(dòng)項(xiàng)目

  3. 通過學(xué)習(xí)我們知道,springboot內(nèi)置了一個(gè)tomcat服務(wù)器愧驱,打包生成的jar包直接可以運(yùn)行,我們通過mvn install命令來編譯打包,在target目錄下改化。進(jìn)入該目錄直接java -jar demo-0.0.1-SNAPSHOT.jar來啟動(dòng)springboot項(xiàng)目兄裂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匾南,隨后出現(xiàn)的幾起案子啃匿,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件溯乒,死亡現(xiàn)場(chǎng)離奇詭異夹厌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)裆悄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門矛纹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人光稼,你說我怎么就攤上這事或南。” “怎么了艾君?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵采够,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我冰垄,道長(zhǎng)吁恍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任播演,我火速辦了婚禮冀瓦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘写烤。我一直安慰自己翼闽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布洲炊。 她就那樣靜靜地躺著感局,像睡著了一般。 火紅的嫁衣襯著肌膚如雪暂衡。 梳的紋絲不亂的頭發(fā)上询微,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音狂巢,去河邊找鬼撑毛。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唧领,可吹牛的內(nèi)容都是我干的藻雌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斩个,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胯杭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起受啥,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤做个,失蹤者是張志新(化名)和其女友劉穎鸽心,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體居暖,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顽频,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膝但。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谤草,死狀恐怖跟束,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丑孩,我是刑警寧澤冀宴,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站温学,受9級(jí)特大地震影響略贮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仗岖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一逃延、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轧拄,春花似錦揽祥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俐末,卻和暖如春料按,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卓箫。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工载矿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烹卒。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓恢准,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甫题。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馁筐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354