Categories
程式開發

SpringBoot系列(2)-第一個SpringBoot程序


項目初始化

之前也介紹過使用SpringBoot構建應用是非常快速的,我們通過使用SpringBoot Initializr來構建項目結構以及依賴,SpringBoot Initializr的使用方式由以下幾種:

使用Web網站構建,其地址為開始“使用Spring Tool Suite構建使用IntelliJ IDEA使用SpringBoot CLI springboot提供的一個命令行工具,可以方便的構建項目

使用Web界面初始化

我們訪問https://start.spring.io/,可以看到最新的構建頁面,不同時期的頁面可能不同,但大致項目相同

SpringBoot系列(2)-第一個SpringBoot程序 1

Project 可以選擇使用Maven或Gradle構建項目Language 選擇開發語言,SpringBooot支持三種:Java、Kotlin、GroovySpringBoot 選擇SpringBoot 版本,之前最新的穩定版本是2.1.5Project Metadata 項目元數據,Group、Artifact等,這裡我們選擇Dependencies 起步依賴,這是SpringBoot能幫我們節省配置時間的關鍵,在後續我們會進行介紹,這裡我們選擇Web和DevTools點擊生成,其會幫我們生成一個zip包,其中格式為:

SpringBoot系列(2)-第一個SpringBoot程序 2

ps:其中有一些是Eclipse生成的文件,比如.settings、.classpath等

使用BootCli進行初始化

Spring Boot CLI是一個命令行工具,能使你快速的初始化SpringBoot。其使用也非常簡單,從SpringBoot官網下載Spring Boot CLI“,並解壓安裝,在其bin目錄有兩個文件spring和spring.bat腳本文件,我們可以通過運行它們來構建項目,比如對於上述的項目,我們使用以下命令將達到同樣的效果:

spring init -dweb,devtools –build maven -p戰爭演示

init 使用Spring Initializr初始化一個項目

-d參數以逗號為分隔符的依賴

–build參數構建系統,默認為maven,可選gradle

-p參數表示項目的包,比如jar、war

我們可以使用spring –help init來查看幫助

運行SpringBoot

項目內容

啟動類

DemoApplication 是啟動類,直接運行就可以

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

}

@SpringBootApplication註解開啟了啟動掃描和自動配置功能,它包含三個註解SpringApplication.run(DemoApplication.class, args) 啟動引導Spring程序。 DemoApplication是最重要的配置類

當我們啟動程序之後,會啟動一個監聽8080端口的Tomcat服務器,不過直接訪問會報錯。

SpringBoot系列(2)-第一個SpringBoot程序 3

配置文件

默認下載的項目中配置文件使用的applicaiton.properties,現在將其替換為application.yml,現在文件為空,暫時沒有任何內容,我們可以在配置文件中進行很多配置,但是暫時我們可以測試的好像也就只有Tomcat的端口號,我們將其調整為9000:

server:
port: 9000

yml文件的配置方式與properties文件不同,如果是上述配置,在applicaiton.properties中為:

server.port=9000

測試類

下載下來的項目文件中,還有一個測試模板:

package com.example.demo;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {

@Test
public void contextLoads() {
}

}

SpringRunner 如果我們使用的是Junit4,則必須使用@SpringBootTest表名當前類是基於SpringBoot的測試類,可以指定啟動類,它自動掃描@SpringBootConfiguration註解的類,所以它能掃描的DemoApplication類

SpringBoot的構建過程解析

通過上述的項目文件,我們發現Spring Boot 與普通的Spring沒有什麼本質的差別,那麼它是怎麼達到自動加載依賴的功能呢,答案就在其構建文件中(Gradle的build.gradle,Maven的pom. xml),我們使用的是Maven,所以我們可以看一下:

4.0.0

org.springframework.boot
spring-boot-starter-parent
2.1.5.RELEASE

com.example
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot

1.8

org.springframework.boot
spring-boot-starter-web

org.springframework.boot
spring-boot-devtools
runtime
true

org.springframework.boot
spring-boot-starter-test
test

org.springframework.boot
spring-boot-maven-plugin

從pom.xml文件中,我們發看到有別於其他項目的配置

設置其parent指向了org.springframework.boot:spring-boot-starter-parent增加了一個插件org.springframework.boot:spring-boot-maven-plugin所有的依賴都沒有設置版本

Demo項目將spring-boot-starter-parent作為父項目,就可以從其中繼承很多常用依賴的版本(其實際配置是在spring-boot-dependencies中設置的),所以可以不用設置版本號。

這樣的好處

想想在沒有這種依賴管理的之前,如果項目需要依賴包我們會怎麼做:

從Maven Repository中搜索需要用到的依賴

複製到pom.xml中

跳轉到1,然後繼續,直到找到所需要的依賴

構建項目,如果依賴的版本之間沒有衝突,啊哈,運氣,如果有衝突那就去網上搜索解決辦法

依賴沒有問題(不容易)

這還是在你寫業務代碼之前要做的工作,想想是不是很繁瑣,關鍵是在你沒開始寫代碼之前,你不確定這是正確的。

自動依賴管理的本質

maven本身俱有依賴管理的功能,上文也說了,所有的常用依賴都是在spring-boot-dependencies-*.pom中設置的,我們打開“看一下,重點看一下dependencyManagement標籤:

...

org.springframework.boot
spring-boot
2.1.5.RELEASE

...

org.slf4j
slf4j-api
${slf4j.version}

...

...

ps:dependencyManagement的作用是聲明依賴及版本,並不會實際引入依賴,因此子項目需要顯示的聲明需要用的依賴。如果不在子項目中聲明依賴,是不會從父項目中繼承下來的;只有在子項目中寫了該依賴項,並且沒有指定具體版本,才會從父項目中繼承該項,並且version和scope都讀取自父pom;另外如果子項目中指定了版本號,那麼會使用子項目中指定的jar版本。

dependencies的作用是聲明並引入依賴,即使子項目中不聲明該依賴,子項目也會引入父項目中的所有依賴。

使用其他版本代替傳入的依賴

比如說在現在的項目中,我們會自動依賴,其版本為,如果我們要換版本比如說將其換成,那麼我們可以直接在pom.xml中進行調整


org.slf4j
slf4j-api
1.7.26

運行SpringBoot程序

我們可以通過使用IDE中的在DemoApplication.java上選擇run as -> Java Application來運行該程序。

SpringBoot系列(2)-第一個SpringBoot程序 4

這就是運行之後的效果,當然因為我們任何業務代碼都沒有寫,所有訪問項目時會出現默認的404頁面。

參考

YAML介紹