開啟Spring Boot 之旅
開啟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 項目的三種方式
ide中直接啟動
cmd 進入項目目錄鍵入
mvn spring-boot:run
來啟動項目通過學習我們知道,springboot內置了一個tomcat服務器,打包生成的jar包直接可以運行,我們通過
mvn install
命令來編譯打包,在target目錄下。進入該目錄直接java -jar demo-0.0.1-SNAPSHOT.jar
來啟動springboot項目。
開啟Spring Boot 之旅