開啟Spring Boot 之旅

來源:互聯網
上載者:User

標籤:plugins   actor   自動   參考   類型   模組   test   packages   pom.xml檔案   

開啟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 應用 */@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: 配置類上來標註這個註解;

? 配置類----對應-----設定檔;配置類也是容器中的一個組件 @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 之旅

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.