1. 程式人生 > >開啟Spring Boot 之旅

開啟Spring Boot 之旅

document sse 項目 場景 resource 大型 start.s 什麽是 ron

開啟Spring Boot 之旅

1、Spring Boot 簡介

簡化Spring應用開發的一個框架;

整個Spring技術棧的一個大整合;

JavaEE開發的一站式解決方案。

2、微服務

Martion Fowler 的一篇長長的文章https://martinfowler.com/microservices/ ,2014;雖然他不是微服務提出者,但是他的這篇文章卻明確定義說明了什麽是微服務。

微服務:架構風格

一個應用應該是一組小型服務;可以通過HTTP的的方式進行溝通。

  • 單體應用(非微服務) ALL IN ONE

    所有的東西都寫在一個應用裏面。開發一個 OA CRM ERP 等系統,一個應用打包成war包放在tomcat等服務器上直接運行。開發測試簡單,部署也簡單。擴展也簡單。負載不行的話,復制十幾份相同的應用放在十幾個服務器上,通過負載均衡機制來提高我們的並發能力。

    問題就是:牽一發而動全身 ;項目越大問題越多。

  • 微服務

技術分享圖片

每一個功能元素最終都是一個可獨立替換和獨立升級的軟件單元;

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

  • 構建大型分布式應用

    服務微化帶來的就是大型分布式的應用,面對如此大型的分布式應用我們該如何構建應用spring的官方網站一個經典的示意圖給了我們思路,首先利用Spring Boot 快速構建應用。利用Spring Cloud進行分布式的網狀互聯互調。利用SpringCloud Date Flow 在分布式中間進行流式數據計算於批處理。

3、Spring Boot Quirk Start

  • https://start.spring.io/

    利用Spring Initializr.快速構建一個Spring Boot 項目。 或者使用Spring官方的集成開發環境 STS 、以及IntelliJ IDEA 等工具進行快速構建Spring Boot項目。

  • 通過Spring Initiallizr 會自動為我們生成如下的目錄結構:

    |-demo

    ? |-src

    ? |-main

    ? |-java

    ? |-com.example.demo

    ? |-DemoApplication.java //啟動類

    ? |-resources

    ? |-static //放置靜態資源

    ? |-templates //前端模板

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

    ? |-test

    ? |-java

    ? |-com.example.demo

    ? |-DemoApplicationTests.java //測試啟動類

    ? |-target //程序打包後會在這裏?

4 、Spring Boot 啟動類

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @SpringBootApplication 來、標註一個主程序類,來說明這是一個Spring Boot 應用
 */
@SpringBootApplication
public class DemoApplication {

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

@SpringBootApplication:Spring Boot應用標註在這個類上說明這個類是Spring Boot的主配置類,

Spring Boot就應該運行這個類的main方法來啟動Spring Boot應用,這個註解點開如下:


@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 的配置類,他點開下面有個@Configuration註解

? @Configuration: 配置類上來標註這個註解;

? 配置類----對應-----配置文件;配置類也是容器中的一個組件 @Component

?

@EnableAutoConfiguration:開啟自動配置功能

? 以前我們需要自己配置東西,而Spring Boot 幫我們自動配置;@EnableAutoConfiguration 添加在配置類上,自動配置才能生效。他點開,你面是一個@AutoConfigurationPackage與@Import的組合註解:

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

@AutoConfigurationPackage:自動配置包的註解

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

? Spring的底層註解@Import,給容器中導入一個組件;導入的組件由AutoConfigurationPackages.==Registrar==.class 來指定。來看該類下的這個方法:

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

我們debug一下:

技術分享圖片

從結果來看,@AutoConfigurationPackage註解就是將主配置類(@SpringBootApplication所標註的類)的所在包及下面所有子包裏面的所有組件掃描到Spring容器。

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

給容器導入組件的作用,導入什麽樣的組件?

AutoConfigurationImportSelector:導入哪些組件的選擇器,進入該類我們來看一個方法:

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一下:

技術分享圖片

如圖,結果加所有需要導入的組件以全類名的方式返回,這些組件就會被添加到容器中;

會給容器中導入非常多的自動配置類(xxxAutoConfiguration):給容器中導入這個場景所需要的所有組件,並配置好這些組件,免去了我們手寫配置註入功能組件等的工作。

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

參數 EnableAutoConfiguration.class,classloader

Spring Boot 在啟動的時候從類路徑下的META-INF/spring.factories中獲取到EnableAutoConfiguration指定的值;將這些值作為自動配置類導入到容器中,自動配置類就生效了。

而實際上Spring底層的配置一個都不能少,只不過這些自動配置幫我們做了。

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

技術分享圖片

5、POM.xml文件

1、父項目
<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的父項目。而他打開後,他的父項目是:

<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應用裏面的所有依賴版本

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

so,我們在Spring Boot 中導入的依賴,默認是不需要寫版本的,spring-boot-dependencies中為我們進行了依賴版本的管理。【而沒有在spring-boot-dependencies中進行依賴版本聲明的自然需要寫版本了】。

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

spring-boot-starter-web:

spring-boot-starter: Spring Boot的場景啟動器

spring-boot-starter-web:幫我們導入web模塊正常運行所依賴的組件,當然以來的版本都受父項目仲裁。

Spring Boot將所有的功能場景都抽取出來,做成一個個的starters(啟動器),只需要在項目中引入這些starter,相關場景的所有依賴都會導入進來。要用什麽功能基因導入什麽場景的啟動器。詳細參考,Spring Boot的幫助文檔 頁面搜索starter。來查看各種場景的啟動器,以及他們所導入的各種依賴。

3、部署相關
<!--將應用打包成一個可執行的jar包-->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
4、其他雜項
<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>

↗包含包名、項目名、版本、打包類型、名稱、描述、以及編碼、JDK版本的配置信息。

6、啟動spring boot 項目的三種方式

  1. ide中直接啟動

  2. cmd 進入項目目錄鍵入 mvn spring-boot:run來啟動項目

  3. 通過學習我們知道,springboot內置了一個tomcat服務器,打包生成的jar包直接可以運行,我們通過mvn install命令來編譯打包,在target目錄下。進入該目錄直接java -jar demo-0.0.1-SNAPSHOT.jar來啟動springboot項目。

開啟Spring Boot 之旅