02_SpringBoot入門(mén)

02_SpringBoot入門(mén)

1、簡(jiǎn)介

簡(jiǎn)化Spring應(yīng)用開(kāi)發(fā)的一個(gè)框架。
整個(gè)Spring技術(shù)棧的一個(gè)大整合。
J2EE開(kāi)發(fā)的一站式解決方案。

  • SpringBoot來(lái)簡(jiǎn)化Spring應(yīng)用開(kāi)發(fā),約定大于配置,去繁從簡(jiǎn),just run就能創(chuàng)建一個(gè)獨(dú)立的,產(chǎn)品級(jí)別的應(yīng)用。
  • 優(yōu)點(diǎn):
  1. 快速創(chuàng)建獨(dú)立運(yùn)行的Spring項(xiàng)目以及與主流框架的集成
  2. 使用嵌入的Servlet容器,應(yīng)用無(wú)需打成jar包。
  3. starters自動(dòng)依賴(lài)與版本控制。
  4. 大量的自動(dòng)配置,簡(jiǎn)化開(kāi)發(fā),也可以修改默認(rèn)值。
  5. 無(wú)序配置xml文件,無(wú)代碼生成,開(kāi)箱即用。
  6. 準(zhǔn)生產(chǎn)環(huán)境的運(yùn)行時(shí)應(yīng)用監(jiān)控。
  7. 與云計(jì)算的天然集成。
  • 缺點(diǎn):
  1. 入門(mén)容易,精通難。
  2. 需要掌握spring技術(shù)。

2、微服務(wù)

2014年,martin fowler在博客中提出。
微服務(wù)是一種架構(gòu)風(fēng)格
一個(gè)應(yīng)用應(yīng)該是一組小型服務(wù)??梢酝ㄟ^(guò)HTTP的方式進(jìn)行互通。

單體應(yīng)用

一個(gè)單體應(yīng)用程序把他所有的功能放在一個(gè)單一進(jìn)程中。。。并且通過(guò)在多個(gè)服務(wù)器上復(fù)制這個(gè)單體進(jìn)行擴(kuò)展

微服務(wù)

一個(gè)微服務(wù)架構(gòu)把每個(gè)功能元素放進(jìn)一個(gè)獨(dú)立的服務(wù)中。。。并且通過(guò)跨服務(wù)器分發(fā)這些服務(wù)進(jìn)行擴(kuò)展,只在需要時(shí)才復(fù)制。

每一個(gè)功能元素最終都是一個(gè)可獨(dú)立替換獨(dú)立升級(jí)的軟件單元。
詳細(xì)參照微服務(wù)提出者的網(wǎng)站。


3、環(huán)境準(zhǔn)備

掌握以下內(nèi)容:

  • Spring框架的使用經(jīng)驗(yàn)
  • 熟練使用Maven進(jìn)行項(xiàng)目構(gòu)建和管理依賴(lài)
  • 熟練使用Eclipse或者IDEA

環(huán)境約束:

  • JDK1.8
  • maven3.X
  • IDEA 2017
  • Spring Boot 1.5.9RELEASE

4、SpringBoot HelloWorld

  1. 創(chuàng)建Maven工程(jar的形式)

  2. 導(dǎo)入springboot相關(guān)依賴(lài)

    <?xml version="1.0" encoding="UTF-8"?>
     <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.springframework</groupId>
        <artifactId>gs-spring-boot</artifactId>
        <version>0.1.0</version>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.1.4.RELEASE</version>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
     <!--可以將應(yīng)用打包成可執(zhí)行的jar包-->
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
  3. 編寫(xiě)一個(gè)主程序

    @SpringBootApplication // 標(biāo)注主程序類(lèi),說(shuō)明是一個(gè)SpringBoot應(yīng)用
    public class Application {
    
        public static void main(String[] args) {
            // 啟動(dòng)Spring應(yīng)用
            SpringApplication.run(Application.class,args);
        }
    
    }
    
  1. 編寫(xiě)相關(guān)的Controller、Service等。

    這里只給出Controller。Service返回一個(gè)字符串即可。

    @Controller
    public class HelloController {
    
        @Autowired
        private HelloService service;
    
        @RequestMapping("/hello")
        @ResponseBody
        public String hello(){
            return service.sayhello();
        }
    
    }
    
  2. 運(yùn)行:

    只需要運(yùn)行主類(lèi)(Application)即可。

  3. 簡(jiǎn)化部署工作

    只需要打Jar包,然后用java -jar 指定jar包,即可訪(fǎng)問(wèn)項(xiàng)目。


5、原理分析

  1. pom文件

    • 父項(xiàng)目

      <parent>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-parent</artifactId>
         <version>2.1.4.RELEASE</version>
      </parent>
      

      這個(gè)父項(xiàng)目還依賴(lài)了一個(gè)父項(xiàng)目:

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

      這個(gè)父項(xiàng)目真正管理SpringBoot應(yīng)用里面所有的依賴(lài)版本。

      SpringBoot的版本仲裁中心;

      以后我們導(dǎo)入依賴(lài)默認(rèn)是不需要寫(xiě)版本的;

      (沒(méi)有在dependencies里面管理的依賴(lài)自然需要聲明版本號(hào))

    • 啟動(dòng)器

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

      spring-boot-starter-web:spring-boot場(chǎng)景啟動(dòng)器;幫我們導(dǎo)入了web模塊正常運(yùn)行所依賴(lài)的組件。

      通過(guò)導(dǎo)入各種starter(啟動(dòng)器)來(lái)適應(yīng)所有功能場(chǎng)景。

  2. 主程序類(lèi)、主入口類(lèi)

    @SpringBootApplication // 標(biāo)注主程序類(lèi),說(shuō)明是一個(gè)SpringBoot應(yīng)用
    public class Application {
    
        public static void main(String[] args) {
            // 啟動(dòng)Spring應(yīng)用
            SpringApplication.run(Application.class,args);
        }
    
    }
    

    @SpringBootApplication : 標(biāo)注在某個(gè)類(lèi)上說(shuō)明這個(gè)類(lèi)是SpringBoot的主配置類(lèi),SpringBoot就應(yīng)該運(yùn)行這個(gè)類(lèi)的main方法來(lái)啟動(dòng)SpringBoot應(yīng)用。

    @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:SpringBoot的配置類(lèi);標(biāo)注在某個(gè)類(lèi)上,表示這是個(gè)SpringBoot的配置類(lèi);

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Configuration
    public @interface SpringBootConfiguration {
    

    點(diǎn)進(jìn)去@SpringBootConfiguration發(fā)現(xiàn),@SpringBootConfiguration上面有個(gè)@Configuration注解,配置類(lèi)上使用的注解,配置類(lèi)--->配置文件;

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Component
    public @interface Configuration {
    

    再點(diǎn)擊@Configuration進(jìn)去發(fā)現(xiàn),他有一個(gè)@Component注解,配置類(lèi)也是容器中的一個(gè)組件;

再看第二個(gè)注解:@EnableAutoConfiguration:開(kāi)啟自動(dòng)配置功能;以前需要我們自己去配置的東西,SpringBoot幫我們自動(dòng)配置;這個(gè)注解告訴SpringBoot開(kāi)啟自動(dòng)配置,只有寫(xiě)了這個(gè)注解,自動(dòng)配置才會(huì)生效。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

點(diǎn)進(jìn)去里面

@AutoConfigurationPackage:自動(dòng)配置包,點(diǎn)進(jìn)去發(fā)現(xiàn)有個(gè)@Import(AutoConfigurationPackages.Registrar.class):Spring底層注解@Import,給容器中導(dǎo)入一個(gè)組件AutoConfigurationPackages.Registrar.class

@AutoConfigurationPackage這個(gè)注解的作用是將主配置類(lèi)(@SpringBootApplication標(biāo)注的類(lèi))的所在的包及下面的所有子包下所有的組件掃描到Spring容器。

而這個(gè)注解下還有一個(gè)@Import(AutoConfigurationImportSelector.class)注解,導(dǎo)入哪些組件的選擇器,會(huì)將所有需要導(dǎo)入的組件以全限定名的方式返回,這些組件就會(huì)被掃描進(jìn)Spring容器。最終會(huì)給容器導(dǎo)入非常多的自動(dòng)配置類(lèi)(XxxAutoConfiguration),作用是給容器中導(dǎo)入這個(gè)場(chǎng)景需要的所有組件,并配置好這些組件。

SpringFactoryLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader):SpringBoot在啟動(dòng)的時(shí)候,會(huì)從從類(lèi)路徑下的META-INF/spring.factories中獲取EnableAutoConfiguration指定的值,將這些值作為自動(dòng)配置類(lèi)導(dǎo)入到容器中,自動(dòng)配置類(lèi)就會(huì)生效,幫我們進(jìn)行自動(dòng)配置工作。以前我們需要自己配置的東西,自動(dòng)配置類(lèi)都幫我們做了。

J2EE的整體解決方案和自動(dòng)配置都在spring-boot-autoconfigure-1.5.9RELEASE.jar中;


6、使用Spring Initializer快速創(chuàng)建SpringBoot項(xiàng)目

RESTAPI的方式:可以在類(lèi)上打@Controller以及@ResponseBody,但是可以用@RestController來(lái)替換;

默認(rèn)生成的SpringBoot項(xiàng)目有幾個(gè)特點(diǎn):

  • 主程序已經(jīng)生成好了,我們只需要編寫(xiě)我們自己的邏輯
  • resources文件夾目錄結(jié)構(gòu):
    • static:保存所有的靜態(tài)資源:js css images;
    • templates:保存所有的模板頁(yè)面:(SpringBoot默認(rèn)jar包使用嵌入式的Tomcat,默認(rèn)不支持JSP頁(yè)面),可以使用模板引擎(freemarker、thymeleaf);
    • application.properties:SpringBoot應(yīng)用的配置文件 -> 可以用來(lái)修改默認(rèn)配置信息。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

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