開啟Spring Boot 之旅
1器赞、Spring Boot 簡(jiǎn)介
簡(jiǎn)化Spring應(yīng)用開發(fā)的一個(gè)框架港柜;
整個(gè)Spring技術(shù)棧的一個(gè)大整合咳榜;
JavaEE開發(fā)的一站式解決方案涌韩。
2、微服務(wù)
Martion Fowler 的一篇長(zhǎng)長(zhǎng)的文章https://martinfowler.com/microservices/ 释树,2014;雖然他不是微服務(wù)提出者嘴拢,但是他的這篇文章卻明確定義說明了什么是微服務(wù)寂纪。
微服務(wù):架構(gòu)風(fēng)格
一個(gè)應(yīng)用應(yīng)該是一組小型服務(wù)捞蛋;可以通過HTTP的的方式進(jìn)行溝通。
-
單體應(yīng)用(非微服務(wù))
ALL IN ONE
所有的東西都寫在一個(gè)應(yīng)用里面庄涡。開發(fā)一個(gè) OA CRM ERP 等系統(tǒng)穴店,一個(gè)應(yīng)用打包成war包放在tomcat等服務(wù)器上直接運(yùn)行拿穴。開發(fā)測(cè)試簡(jiǎn)單默色,部署也簡(jiǎn)單。擴(kuò)展也簡(jiǎn)單缘厢。負(fù)載不行的話义钉,復(fù)制十幾份相同的應(yīng)用放在十幾個(gè)服務(wù)器上捶闸,通過負(fù)載均衡機(jī)制來提高我們的并發(fā)能力删壮。
問題就是:牽一發(fā)而動(dòng)全身 ;項(xiàng)目越大問題越多税灌。
-
微服務(wù)
)
每一個(gè)功能元素最終都是一個(gè)可獨(dú)立替換和獨(dú)立升級(jí)的軟件單元菱涤;
詳細(xì)參閱:中文文檔 (martinfowler文章的翻譯( ̄▽ ̄)*( ̄▽ ̄)*)
-
構(gòu)建大型分布式應(yīng)用
服務(wù)微化帶來的就是大型分布式的應(yīng)用粘秆,面對(duì)如此大型的分布式應(yīng)用我們?cè)撊绾螛?gòu)建應(yīng)用spring的官方網(wǎng)站一個(gè)經(jīng)典的示意圖給了我們思路收毫,首先利用Spring Boot 快速構(gòu)建應(yīng)用此再。利用Spring Cloud進(jìn)行分布式的網(wǎng)狀互聯(lián)互調(diào)输拇。利用SpringCloud Date Flow 在分布式中間進(jìn)行流式數(shù)據(jù)計(jì)算于批處理。
3议慰、Spring Boot Quirk Start
-
利用Spring Initializr.快速構(gòu)建一個(gè)Spring Boot 項(xiàng)目奴曙。 或者使用Spring官方的集成開發(fā)環(huán)境 STS 、以及IntelliJ IDEA 等工具進(jìn)行快速構(gòu)建Spring Boot項(xiàng)目炉菲。
-
通過Spring Initiallizr 會(huì)自動(dòng)為我們生成如下的目錄結(jié)構(gòu):
|-demo
? |-src
? |-main
? |-java
? |-com.example.demo
? |-DemoApplication.java //啟動(dòng)類
? |-resources
? |-static //放置靜態(tài)資源
? |-templates //前端模板
? |-application.properties //配置文件
? |-test
? |-java
? |-com.example.demo
? |-DemoApplicationTests.java //測(cè)試啟動(dòng)類
? |-target //程序打包后會(huì)在這里?
4 堕战、Spring Boot 啟動(dòng)類
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @SpringBootApplication 來、標(biāo)注一個(gè)主程序類越驻,來說明這是一個(gè)Spring Boot 應(yīng)用
*/
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
//Spring應(yīng)用啟動(dòng)起來
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication:Spring Boot應(yīng)用標(biāo)注在這個(gè)類上說明這個(gè)類是Spring Boot的主配置類缀旁,
Spring Boot就應(yīng)該運(yùn)行這個(gè)類的main方法來啟動(dòng)Spring Boot應(yīng)用并巍,這個(gè)注解點(diǎn)開如下:
@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 的配置類懊渡;
? 標(biāo)注在摸個(gè)類上表示這是一個(gè) Spring Boot 的配置類剃执,他點(diǎn)開下面有個(gè)@Configuration注解
? @Configuration: 配置類上來標(biāo)注這個(gè)注解肾档;
? 配置類----對(duì)應(yīng)-----配置文件;<u>配置類也是容器中的一個(gè)組件 @Component</u>
?
@EnableAutoConfiguration:開啟自動(dòng)配置功能
? 以前我們需要自己配置東西骇两,而Spring Boot 幫我們自動(dòng)配置低千;@EnableAutoConfiguration 添加在配置類上示血,自動(dòng)配置才能生效救拉。他點(diǎn)開亿絮,你面是一個(gè)@AutoConfigurationPackage與@Import的組合注解:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自動(dòng)配置包的注解
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
? Spring的底層注解@Import黔姜,給容器中導(dǎo)入一個(gè)組件秆吵;導(dǎo)入的組件由AutoConfigurationPackages.==Registrar==.class 來指定纳寂。來看該類下的這個(gè)方法:
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
我們debug一下:
從結(jié)果來看黔牵,@AutoConfigurationPackage注解就是將主配置類(@SpringBootApplication所標(biāo)注的類)的所在包及下面所有子包里面的所有組件掃描到Spring容器猾浦。
@Import({org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.class})
給容器導(dǎo)入組件的作用金赦,導(dǎo)入什么樣的組件夹抗?
AutoConfigurationImportSelector:導(dǎo)入哪些組件的選擇器漠烧,進(jìn)入該類我們來看一個(gè)方法:
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一下:
如圖通殃,結(jié)果加所有需要導(dǎo)入的組件以全類名的方式返回画舌,這些組件就會(huì)被添加到容器中曲聂;
會(huì)給容器中導(dǎo)入非常多的自動(dòng)配置類(xxxAutoConfiguration):給容器中導(dǎo)入這個(gè)場(chǎng)景所需要的所有組件朋腋,并配置好這些組件,免去了我們手寫配置注入功能組件等的工作把将。
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
參數(shù) EnableAutoConfiguration.class,classloader
Spring Boot 在啟動(dòng)的時(shí)候從類路徑下的META-INF/spring.factories中獲取到EnableAutoConfiguration指定的值洽议;將這些值作為自動(dòng)配置類導(dǎo)入到容器中亚兄,自動(dòng)配置類就生效了审胚。
而實(shí)際上Spring底層的配置一個(gè)都不能少膳叨,只不過這些自動(dòng)配置幫我們做了。
JavaEE的整體整合解決方案和自動(dòng)配置都在:spring-boot-autoconfigure-2.0.4.RELEASE.jar中
5、POM.xml文件
1健田、父項(xiàng)目
<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的父項(xiàng)目抄课。而他打開后间聊,他的父項(xiàng)目是:
<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應(yīng)用里面的所有依賴版本
↗即型豁,Spring Boot 的版本仲裁中心:
so迎变,我們?cè)赟pring Boot 中導(dǎo)入的依賴驼侠,默認(rèn)是不需要寫版本的倒源,spring-boot-dependencies
中為我們進(jìn)行了依賴版本的管理「烀【而沒有在spring-boot-dependencies
中進(jìn)行依賴版本聲明的自然需要寫版本了】。
2、導(dǎo)入依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
spring-boot-starter-web
:
spring-boot-starter: Spring Boot的場(chǎng)景啟動(dòng)器
spring-boot-starter-web:幫我們導(dǎo)入web模塊正常運(yùn)行所依賴的組件,當(dāng)然以來的版本都受父項(xiàng)目仲裁妥粟。
Spring Boot將所有的功能場(chǎng)景都抽取出來,做成一個(gè)個(gè)的starters(啟動(dòng)器)播急,只需要在項(xiàng)目中引入這些starter,相關(guān)場(chǎng)景的所有依賴都會(huì)導(dǎo)入進(jìn)來握截。要用什么功能基因?qū)胧裁磮?chǎng)景的啟動(dòng)器。詳細(xì)參考畜眨,Spring Boot的幫助文檔 頁面搜索starter。來查看各種場(chǎng)景的啟動(dòng)器恬汁,以及他們所導(dǎo)入的各種依賴。
3、部署相關(guān)
<!--將應(yīng)用打包成一個(gè)可執(zhí)行的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
4、其他雜項(xiàng)
<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>
↗包含包名、項(xiàng)目名贪婉、版本、打包類型尤蒿、名稱竣贪、描述、以及編碼、JDK版本的配置信息拍皮。
6、啟動(dòng)spring boot 項(xiàng)目的三種方式
ide中直接啟動(dòng)
cmd 進(jìn)入項(xiàng)目目錄鍵入
mvn spring-boot:run
來啟動(dòng)項(xiàng)目通過學(xué)習(xí)我們知道,springboot內(nèi)置了一個(gè)tomcat服務(wù)器愧驱,打包生成的jar包直接可以運(yùn)行,我們通過
mvn install
命令來編譯打包,在target目錄下改化。進(jìn)入該目錄直接java -jar demo-0.0.1-SNAPSHOT.jar
來啟動(dòng)springboot項(xiàng)目兄裂。