標籤:plugins actor 自動 參考 類型 模組 test packages pom.xml檔案
開啟Spring Boot 之旅1、Spring Boot 簡介
簡化Spring應用開發的一個架構;
整個Spring技術棧的一個大整合;
JavaEE開發的一站式解決方案。
2、微服務
Martion Fowler 的一篇長長的文章https://martinfowler.com/microservices/ ,2014;雖然他不是微服務提出者,但是他的這篇文章卻明確定義說明了什麼是微服務。
微服務:架構風格
一個應用應該是一組小型服務;可以通過HTTP的的方式進行溝通。
每一個功能元素最終都是一個可獨立替換和獨立升級的軟體單元;
詳細參閱:中文文檔 (martinfowler文章的翻譯( ̄▽ ̄)~( ̄▽ ̄)~)
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 項目的三種方式
ide中直接啟動
cmd 進入項目目錄鍵入 mvn spring-boot:run來啟動項目
通過學習我們知道,springboot內建了一個tomcat伺服器,打包產生的jar包直接可以運行,我們通過mvn install命令來編譯打包,在target目錄下。進入該目錄直接java -jar demo-0.0.1-SNAPSHOT.jar來啟動springboot項目。
開啟Spring Boot 之旅