SprintBoot簡單入門

懵懂小虎發表於2021-08-05

1、什麼是SpringBoot

SpringBoot是基於Spring的基礎上提供了一套全新的框架,其目的是為了在開發時簡化Spring的相關配置及開發過程。在SpringBoot未出來之前,準備搭建一個Spring的開發環境需要配置一堆的XML檔案,而SpringBoot就是去除了大量的XML配置檔案,簡化了複雜的依賴管理。

Spring Boot整合了大量常用的第三方庫配置,Spring Boot 應用中這些第三方庫幾乎可以是零配置的開箱即用(out-of-the-box),大部分的Spring Boot應用都只需要非常少量的配置程式碼(基於Java 的配置),開發者能夠更加專注於業務邏輯。

2、SpringBoot特徵

  • 獨立執行的Spring專案,使用jar包的形式獨立執行,只需通過命令java -jar xx.jar即可執行。
  • 內嵌Servlet容器(例如TomcatJetty或者Undertow 等),應用無需打成WAR包 。
  • 提供starter簡化Maven配置,提供了一系列的starter專案物件模型(POMS)來簡化 Maven配置。
  • 提供了大量的預設自動配置,來簡化專案的開發,開發人員也通過配置檔案修改預設配置。
  • 自帶應用監控(如指標、健康檢查和外部化配置)。
  • 沒有程式碼生成和XML配置。

3、快速搭建SpringBoot

  • 引入maven依賴
    首先引入parent依賴
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.3</version>
</parent>

因為是要開發一個web專案,因此需要引入web依賴。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 建立啟動類
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
  • 建立controller
@RestController
@RequestMapping(path = "/v1/index")
public class IndexController {
    @GetMapping(path = "")
    public String index(){
        return "Hello Spring Boot!";
    }
}
  • 啟動專案
Connected to the target VM, address: '127.0.0.1:54766', transport: 'socket'

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::                (v2.5.3)

2021-08-04 23:16:55.694  INFO 15528 --- [           main] com.tenghu.sb.Application                : Starting Application using Java 1.8.0_301 on Arvin with PID 15528 (E:\project\java\spring-boot-study\target\classes started by admin in E:\project\java\spring-boot-study)
2021-08-04 23:16:55.696  INFO 15528 --- [           main] com.tenghu.sb.Application                : No active profile set, falling back to default profiles: default
2021-08-04 23:16:56.231  INFO 15528 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-08-04 23:16:56.237  INFO 15528 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-08-04 23:16:56.237  INFO 15528 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.50]
2021-08-04 23:16:56.292  INFO 15528 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-08-04 23:16:56.292  INFO 15528 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 567 ms
2021-08-04 23:16:56.503  INFO 15528 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-08-04 23:16:56.509  INFO 15528 --- [           main] com.tenghu.sb.Application                : Started Application in 1.065 seconds (JVM running for 1.607)
2021-08-04 23:17:07.919  INFO 15528 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-08-04 23:17:07.919  INFO 15528 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2021-08-04 23:17:07.920  INFO 15528 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

看到這個結果,表示SpringBoot專案就已經啟動成功了,現在使用瀏覽器訪問路徑http://localhost:8080/v1/index就可以看到瀏覽器輸出結果:Hello Spring Boot!

以上是手動建立一個空的maven專案,手動新增依賴的方式建立一個簡單的spring boot專案,另外還有兩種方式可以快速生成spring boot專案:

  • 使用IDEA,裡面已經整合了SpringBoot外掛
  • 使用官網提供的建立SpringBoot外掛。https://start.spring.io/

4、SpringBoot配置檔案

從上面的簡單例子已經可以看出,我們沒有將專案打包成war檔案釋出到Tomcat容器,就可以啟動專案,並且從日誌上看出埠預設就是8080,從上面特性已經指出SpringBoot內嵌了Tomcat容器,並且設定了必須的一些預設值,那麼如果我們想替換相關預設值,就可以使用自定義的配置檔案來覆蓋預設配置。

SpringBoot提供了兩種配置檔案型別:propertiesyml(而yml也可以寫成yaml)。預設配置檔名稱為:application,放在resources目錄下。這兩種配置檔案在同一級的優先順序為:properties>yml>yaml

比如把預設埠改為8088,上面訪問路徑為http://localhost:8080/v1/index,按照之前的習慣,通常是主機後面會跟專案名,也可以通過配置檔案配置。

使用yaml方式配置:

server:
  servlet:
    context-path: /spring-boot
  port: 8088

注意:yaml的配置方式:號後面必須有空格。

簡單介紹下yaml的基本語法:

  • 大小寫敏感
  • 資料值前面必須有空格(也就是:號後面),作為分隔符
  • 使用縮排表示層級關係
  • 縮排時不允許使用Tab鍵,只允許使用空格(因為各個系統Tab對應的空格數目可能不同,導致層級混亂)
  • 縮排的空格數目不重要,只要相同層級的元素左對齊就行
  • #表示註釋,從這個字元到行尾,都會被解析器忽略

yaml的資料格式:

  • 物件(map): 鍵值對的集合
person:
  name: lisi

# 行內寫法
person: {name: lisi}
  • 陣列:一組按次排列的值
names:
  - zhangsan
  - lisi

# 行內寫法
names: [zhangsan,lisi]
  • 純量:單個的、不可再分的值
msg1: `hello \n world` #單引號忽略轉義字元
msg2: "hello \n world" #雙引識別轉義字元

yaml引數引用:
有時候在配置一個引數,想被多個地方引用,可以這樣配置:

name: zhangsan
person:
  name: ${name} #引用上面定義的name的值

使用properties配置:

server.servlet.context-path=/spring-boot
server.port=8088

注意:配置context-path必須是/開頭

啟動專案從日誌輸出:

Tomcat started on port(s): 8088 (http) with context path '/spring-boot'

這個時候我們的訪問路徑就是:http://localhost:8088/spring-boot/v1/index

5、讀取配置內容

在實際開發時,有時候需要做一些初始化的自定義配置,那麼怎麼在程式碼裡面獲取到配置檔案的自定義配置,比如自定義配置name: zhangsan。讀取配置內容有如下三種方式:

  • 使用註解@Value
@Value("${name:lisi}")
private String name;

@GetMapping(path = "")
public String index(){
    return String.format("Hello %s Spring Boot!",name);
}

訪問結果:Hello zhangsan Spring Boot!,使用@Value註解就可以獲取配置檔案的自定義配置,:後面表示預設值,如果配置檔案沒有配置,則取預設值。

  • Environment
@Autowired
private Environment environment;

System.out.println(String.format("使用Environment獲取配置name:%s",environment.getProperty("name")));

輸出結果:使用Environment獲取配置name:zhangsan

  • @ConfigurationProperties
    定義一個User
@Component
@ConfigurationProperties(prefix = "user")
@Data
public class User {
    private String name;
    private int age;
    private List<String> address;
    
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address=" + address +
                '}';
    }
}

必須使用@Component@ConfigurationProperties註解,@Data是使用了lombok外掛。如果需要使用lombok,需要在IDEA安裝Lombok外掛,引入lombok依賴

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

配置檔案如下配置:

user:
  name: zhangsan
  age: 12
  address:
   - sichuang
   - hunan

controller中使用

@Autowired
private User user;

System.out.println(user.toString());

輸出結果:User{name='admin', age=12, address=[sichuan, hunan]}

6、使用Profile多環境切換

在實際開發場景中,我們一般有開發、測試、生產環境,每個環節的某些配置會不一樣,那麼怎麼來解決不同環境配置的問題,下面詳細介紹使用Profile多環境的切換。

profile多環境配置方式:

  • profile檔案的方式,提供多個配置檔案,每個檔案代表一種環境。
    • application-dev.properties/yml 開發環境
    • application-test.properties/yml 測試環境
    • application-prod.properties/yml 生產環境
  • yml多文件方式:
    • 在yml配置檔案中使用---分割不同配置

profile啟用多環境方式:

  • 配置檔案,在配置檔案使用配置spring.profiles.active=dev
  • 虛擬機器引數:在IDEAVM options指定:-Dspring.profiles.active=dev
  • 命令列引數:
    • 打包情況下:java -jar xxx.jar --spring.profiles.active=dev
    • 使用IDEA下的Program arguments指定:--spring.profiles.active=dev

多檔案的方式這裡就不做操作了,上面介紹已經說明了,按照標準的檔案格式命名就行,根據實際情況選擇是用properties還是yml的方式。下面介紹下yml多文件的方式:

# 開發環境
---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8081
# 測試環境
---
spring:
  config:
    activate:
      on-profile: test
server:
  port: 8082
# 生產環境
---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 8082
---
# 公用配置
server:
  servlet:
    context-path: /spring-boot

至於啟用的方式,就參考上面的測試即可。