開啟Spring Boot 之旅

ldzsl發表於2021-09-09

開啟Spring Boot 之旅

1、Spring Boot 簡介

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

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

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

2、微服務

2014;雖然他不是微服務提出者,但是他的這篇文章卻明確定義說明了什麼是微服務。

微服務:架構風格

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

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

    所有的東西都寫在一個應用裡面。開發一個 OA CRM ERP 等系統,一個應用打包成war包放在tomcat等伺服器上直接執行。開發測試簡單,部署也簡單。擴充套件也簡單。負載不行的話,複製十幾份相同的應用放在十幾個伺服器上,透過負載均衡機制來提高我們的併發能力。

    問題就是:牽一髮而動全身 ;專案越大問題越多。

  • 微服務

    圖片描述

    微服務.PNG


    )


  • 利用.快速構建一個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 應用
 */@SpringBootApplicationpublic 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: 配置類上來標註這個註解;

配置類----對應-----配置檔案;<u>配置類也是容器中的一個元件 @Component</u>


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

圖片描述

debug.PNG

從結果來看,@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一下:

圖片描述

AutoConfiguration

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

會給容器中匯入非常多的自動配置類(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,相關場景的所有依賴都會匯入進來。要用什麼功能基因匯入什麼場景的啟動器。詳細參考, 頁面搜尋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專案。



作者:廚房有隻偷吃的貓
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2325/viewspace-2818532/,如需轉載,請註明出處,否則將追究法律責任。

相關文章