spring boot筆記--入門

一声登、Spring Boot入門

1狠鸳、簡介

Spring官網(wǎng)

Spring boot來簡化Spring應用開發(fā)的一個框架,整個Spring技術(shù)棧的一個大整合悯嗓,約定大于配置件舵,去繁從簡,just run就能創(chuàng)立一個獨立的脯厨,產(chǎn)品級別的應用

背景: J2EE笨重的開發(fā)铅祸、配置繁多,復雜的部署流程、第三方技術(shù)集成壓力大

解決:

  • Spring Boot --> J2EE一站式解決方案

  • Spring Cloud --> 分布式整體解決方案

優(yōu)點:

  • 快速創(chuàng)建獨立運行的Spring項目以及主流框架集成

  • 使用嵌入式的Servlet容器临梗,應用無需打成WAR包

  • starters自動依賴和版本控制

  • 大量的自動配置涡扼,簡化開發(fā),也可修改默認值

  • 無需配置XML盟庞,無代碼生成吃沪,開箱即用

  • 準生產(chǎn)環(huán)境的運行時應用監(jiān)控

  • 與云計算的天然集成

缺點: 易學難精

2、微服務

2014年什猖,Martin Fowler寫了一篇文章票彪,微服務是一種架構(gòu)風格,一個應用應該是一組小型服務不狮,可以通過HTTP進行通信降铸。每一個功能元素都是可獨立替換和升級的單元。

Spring Boot可以快速構(gòu)建一個應用摇零,Spring Cloud進行網(wǎng)狀互連互調(diào)推掸,Spring Cloud Data Flow在分布式中進行流式計算和批處理

image

James Lewis and Martin Fowler (2014)

What are Microservices?

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.


谷歌翻譯后:

James Lewis and Martin Fowler (2014)

What are Microservices?

簡而言之,微服務架構(gòu)風格是一種將單個應用程序開發(fā)為一組小服務的方法驻仅,每個小服務都在自己的進程中運行并與輕量級機制(通常是HTTP資源API)進行通信谅畅。 這些服務圍繞業(yè)務功能構(gòu)建,并且可以由全自動部署機制獨立部署雾家。 這些服務的集中管理幾乎沒有,可以用不同的編程語言編寫并使用不同的數(shù)據(jù)存儲技術(shù)绍豁。

3芯咧、Hello World

3.1 快速創(chuàng)建一個Spring Boot項目

  • File-->New-->Project,選中Spring Initializr竹揍,默認點擊next
image
  • 填寫Group敬飒、Artifact、Package芬位,點擊next
image
  • 選擇導入的模塊无拗,這里我們先只選Spring Web,點擊next
image
  • 填寫Project name昧碉,點擊Finish
image
  • 在com.springboot.helloworld右鍵New Class英染,寫入controller.HelloController,點擊OK被饿,在HelloController下寫入

    
    @RestController
    
    public class HelloController {
    
        @RequestMapping("/hello")
    
        public String hello(){
    
            return "Hello Spring boot ";
    
        }
    
    }
    
    
  • 啟動主程序四康,在瀏覽器寫入localhost:8080/hello即可成功

  • 注意resources文件夾下

    • static:保存所有的靜態(tài)資源,如:js狭握、css闪金、images

    • templates:保存所有的模板界面

    • application.properties:Spring Boot的應用配置文件馬可以修改一些默認設置

3.2 POM文件

3.2.1 父項目

pom.xml文件開頭引入父項目


<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-parent</artifactId>

    <version>2.2.2.RELEASE</version>

    <relativePath/> <!-- lookup parent from repository -->

</parent>

按住Ctrl點擊spring-boot-starter-parent,可以看到這個父項目還依賴一個父項目


<parent>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-dependencies</artifactId>

    <version>2.2.2.RELEASE</version>

    <relativePath>../../spring-boot-dependencies</relativePath>

</parent>

再點擊spring-boot-dependencies,可以看到定義了許多依賴的版本哎垦,他來管理Spring Boot里的所有依賴版本囱嫩,以后我們導入依賴默認是不需要導入版本的(沒有在dependencies里面的依賴自然需要聲明版本號)


<properties>

    <activemq.version>5.15.11</activemq.version>

    <antlr2.version>2.7.7</antlr2.version>

    <appengine-sdk.version>1.9.77</appengine-sdk.version>

    <artemis.version>2.10.1</artemis.version>

    <aspectj.version>1.9.5</aspectj.version>

    <assertj.version>3.13.2</assertj.version>

    <atomikos.version>4.0.6</atomikos.version>

    <awaitility.version>4.0.1</awaitility.version>

    <bitronix.version>2.1.4</bitronix.version>

    <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>

    <byte-buddy.version>1.10.4</byte-buddy.version>

    ......

3.2.2 導入的依賴

JAR包是有誰導入的,我們繼續(xù)看pom.xml可以看到


<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>

可以看到spring-boot-starter-web與父項目的spring-boot-starter-parent有一個共有的spring-boot-starter

spring-boot-starter是Spring Boot場景啟動器

點擊spring-boot-starter-web可以看到它也有一些依賴導入


<dependencies>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter</artifactId>

        <version>2.2.2.RELEASE</version>

        <scope>compile</scope><!-- 依賴spring-boot-starter基礎項目 -->

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-json</artifactId>

        <version>2.2.2.RELEASE</version><!-- 依賴json -->

        <scope>compile</scope>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-tomcat</artifactId>

        <version>2.2.2.RELEASE</version><!-- 依賴tomcat -->

        <scope>compile</scope>

    </dependency>

    <dependency>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-validation</artifactId>

        <version>2.2.2.RELEASE</version><!-- 依賴數(shù)據(jù)校驗 -->

        <scope>compile</scope>

        <exclusions>

            <exclusion>

                <artifactId>tomcat-embed-el</artifactId>

                <groupId>org.apache.tomcat.embed</groupId>

            </exclusion>

        </exclusions>

    </dependency>

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-web</artifactId>

        <version>5.2.2.RELEASE</version>

        <scope>compile</scope>

    </dependency>

    <dependency>

        <groupId>org.springframework</groupId>

        <artifactId>spring-webmvc</artifactId>

        <version>5.2.2.RELEASE</version>

        <scope>compile</scope>

    </dependency>

</dependencies>

幫我們導入了web模塊正常運行所依賴的組件

Spring Boot將所有的場景功能都抽取出來漏设,做成一個個starters(啟動器)墨闲,只需要在項目里引入這些starter,相關場景的所有依賴都會導入進來愿题。

3.3 主程序類

3.3.1 注解


@SpringBootApplication()

public class HelloWorldMainApplication {

    public static void main(String[] args) {

        SpringApplication.run(HelloWorldMainApplication.class, args);

    }

}

  • @SpringBootApplication()

Spring Boot標注在某個類上說明這個類是Spring Boot的主配置類损俭,Spring Boot就應該運行這個類的main方法來啟動Spring Boot應用

我們點擊它來查看怀喉,發(fā)現(xià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配置咆繁,它標注在某個類上表示這個一個Spring Boot配置類


@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Configuration

public @interface SpringBootConfiguration {

點擊@SpringBootConfiguration,可以看到@Configuration疗我,這就是Spring最底層的一個注解仔夺,配置類上來標注這個注解琐脏。配置類------配置文件,配置類也是一個組件@Component缸兔。


@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Component

public @interface Configuration {

  • @EnableAutoConfiguration

還可以看到一個@EnableAutoConfiguration日裙,作用是開啟自動配置功能,Spring Boot幫我們自動配置惰蜜,我們可以點開查看


@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import({AutoConfigurationImportSelector.class})

public @interface EnableAutoConfiguration {

@AutoConfigurationPackage自動配置包

點開來看


@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@Import({Registrar.class})

public @interface AutoConfigurationPackage {

@Import({Registrar.class})昂拂,@import:Spring的底層注解,給容器中導入一個組件抛猖,點擊Registrar.class格侯,查看這個類

可以看到下面這個方法


public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {

    AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());

}

我們在AutoConfigurationPackages.register這一行加一個斷點,并debug運行财著,可以發(fā)現(xiàn)metadata是我們注解的原信息@SpringBootApplication()联四,我們還可以拉動鼠標選中


(new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()

點擊右鍵選擇Evaluate Expression,點擊Evaluate按鈕撑教,可以看到result就等于我們的包名

所以@AutoConfigurationPackage就是將主配置類@SpringBootApplication()標注的類所在包及下面所有子包里面的所有組件掃描到容器中

@EnableAutoConfiguration里還有一個注解

@Import({AutoConfigurationImportSelector.class})朝墩,點進去查看


public String[] selectImports(AnnotationMetadata annotationMetadata) {

發(fā)現(xiàn)selectImports將所有需要導入的組件全類名的方式返回,這些組件就會被添加到容器中伟姐,我們通過debug可以發(fā)現(xiàn)導入的組件中有很多的自動配置類收苏,就是給容器導入場景所需要的組件并配置好

結(jié)束

更多文章請關注后續(xù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愤兵,隨后出現(xiàn)的幾起案子倒戏,更是在濱河造成了極大的恐慌,老刑警劉巖恐似,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杜跷,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機葛闷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門憋槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淑趾,你說我怎么就攤上這事阳仔。” “怎么了扣泊?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵近范,是天一觀的道長。 經(jīng)常有香客問我延蟹,道長评矩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任阱飘,我火速辦了婚禮斥杜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沥匈。我一直安慰自己蔗喂,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布高帖。 她就那樣靜靜地躺著缰儿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪散址。 梳的紋絲不亂的頭發(fā)上乖阵,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音爪飘,去河邊找鬼义起。 笑死拉背,一個胖子當著我的面吹牛师崎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椅棺,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼犁罩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了两疚?” 一聲冷哼從身側(cè)響起床估,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎诱渤,沒想到半個月后丐巫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年递胧,在試婚紗的時候發(fā)現(xiàn)自己被綠了碑韵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缎脾,死狀恐怖祝闻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遗菠,我是刑警寧澤联喘,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站辙纬,受9級特大地震影響豁遭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牲平,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一堤框、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纵柿,春花似錦蜈抓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至渊跋,卻和暖如春腊嗡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾酝。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工燕少, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蒿囤。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓客们,卻偏偏與公主長得像,于是被迫代替她去往敵國和親材诽。 傳聞我的和親對象是個殘疾皇子底挫,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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