SpringBoot 學習筆記_環境搭建及基本配置

SpringBoot 學習筆記_環境搭建及基本配置

聲明:

本次學習參考 《SpringBoot + Vue 開發實戰》 · 王松(著) 一書。

本文的目的是爲了記錄我在學習的過程和遇到的一些問題以及解決辦法。

如有侵權,請聯繫我刪除。

SpringBoot 環境手動搭建

Maven 工程創建

  • mvn 命令創建
  • IntelliJ IDEA 創建
    • 創建項目。(選擇 Maven, 點擊 Next。)

    • 輸入組織名稱、模塊名稱、項目版本號等。

    • 選擇項目位置,點擊 Finish 按鈕,完成項目創建。

    • 添加 SpringBoot 依賴。

      <parent>
      	<groupId> org.springframework.boot </groupId>
      	<artifactId> spring-boot-starter-parent </artifactId>
      	<version> 2.0.4.RELEASE </version>
      </parent>
      

      spring-boot-starter-parent 是一個特殊的 starter,提供一些 Maven 的默認配置。

    • 編寫啓動類

      Maven 工程的 java 目錄下創建項目的包,包裏創建一個 App

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

      @EnableAutoConfiguration 註解表示開啓自動化配置。由於項目添加了 spring-boot-starter-web 依賴,因此在開啓了自動化配置之後會自動進行 SpringSpring MVC 的配置

      main 方法中, SpringApplication 中的 run 方法啓動項目。第一個參數傳入 App.class, 告訴 Spring 哪個是主要組件。第二個參數是運行時輸入的其他參數

    • 編寫控制器測試

      @RestController
      public class HelloController {
      	@GetMapping("/hello")
      	public String hello() {
      		return "hello spring boot!";
      	}
      }
      

      控制器中提供 /hello 接口,此時需要配置包掃描才能將 HelloController 註冊到 SpringMVC 容器中,因此需要在 App 類上面再添加一個註解 @ComponentScan 進行包掃描。

      @EnableAutoConfiguration
      @ComponentScan
      public class App {
      	public static void main(String[] args) {
      		SpringApplication.run(App.class, args);
      	}
      }
      

      也可以使用組合註解 @SpringBootApplication 來替代。

      @SpringBootApplication
      public class App {
      	public static void main(String[] args) {
      		SpringApplication.run(App.class, args);
      	}
      }
      
    • 項目啓動

      • maven 命令啓動
        mvn spring-boot:run
        
      • 運行 main 方法
      • maven 打包啓動
        • 添加配置 pom.xml
          <build>
          	<plugins>
          		<plugin>
          			<groupId>org.springframework.boot</groupId>
          			<artifactId>spring-boot-maven-plugin</artifactId>
          		</plugin>
          	</plugins>
          </build>
          
        • 運行 mvn package 命令

SpringBoot 環境自動搭建

上述是整個搭建 SpringBoot 開發環境的步驟,實際開發中,我們很少做這些,因爲,我們可以藉助一些工具自動搭建並配置 SpringBoot 環境

  • 方法一:SpringBoot 官網在線創建: https://start.spring.io
  • 方法二:IntelliJIDEA 創建
    • 新建(選擇 Spring Initializr)
      1
    • 輸入基本信息
      2
    • 選擇依賴
      3
    • 選擇項目路徑
      4

SpringBoot 基礎配置

spring-boot-starter-parent

主要提供瞭如下默認配置:

  • Java 版本默認 1.8
  • 編碼格式默認 UTF-8
  • 提供 Dependency Management 進行項目依賴的版本管理
  • 默認的資源過濾與插件配置

@SpringBootApplication 註解

是一個組合註解。由三個註解組成:

  • @SpringBootConfiguration

    實際上就是一個 @Configration 註解,表明這是一個配置類,開發者可以在這個類中配置 Bean。該類扮演的角色有點類似於 Spring 中的 applicationContext.xml

  • @EnableAutoConfiguration

    表示開啓自動化配置。 SpringBoot 中的自動化配置是非侵入式的,在任意時刻,開發者都可以使用自定義配置替代自動化配置中的某一個配置。

  • @ComponentScan

    完成包掃描,也是 Spring 中的功能。由於 @ComponentScan 註解默認掃描的類都位於當前類所在包下,因此建議將啓動項目類放在根目錄中。

雖然項目啓動類中包含 @Configuration 註解(@SpringBootConfiguration),但是開發者可以創建一個自定義的類,專門用來配置 Bean , 這樣便於配置的管理,只需要加上 @Configuration 註解即可。

@Configuration
public class MyConfig(){}

項目啓動類中的 @ComponentScan 註解,除了掃描 @Service@Repository@Component@Controller@RestController 等之外,也會掃描 @Configuration 註解的類

自定義 banner

SpringBoot 項目啓動時會打印一個標識。可以在 resource 目錄下通過創建一個 banner.txt 文件來自定義。

參考藝術字網站:

  • http://www.network-science.de/ascii

Web 容器配置

TomCat 配置

Spring Boot 配置中,可以內置 TomcatJettyUndertowNetty等容器。

當添加了 spring-boot-starter-web 依賴之後,默認會使用 Tomcat 作爲 Web 容器。

如果需要對 Tomcat 做進一步配置,可以在 application.properties 中進行配置:

server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
server.servlet.context-path=/chapter02
server.tomcat.uri-encoding=utf-8
server.tomcat.max-threads=500
server.tomcat.basedir=/home/sang/tmp
  • server.port

    Web 容器的端口號

  • server.error.path

    項目出錯時跳轉的頁面

  • server.servlet.session.timeout

    session 失效時間。默認單位(秒:s),但由於 Tomcat 以(分鐘:s)爲單位,因此,如果設置爲秒,則會被轉換爲一個小於等於該秒數的分鐘。

  • server.servlet.context-path

    項目名稱。默認是/,如果配置了,就需要在訪問路徑上加上配置的路徑

  • server.tomcat.uri-encoding

    Tomcat 請求編碼

  • server.tomcat.max-threads

    Tomcat 最大線程數

  • server.tomcat.basedir

    存放 Tomcat 運行日誌和臨時文件的目錄。若不配置,則默認使用系統臨時目錄

HTTPS 配置

由於 HTTPS 良好的安全性,在開發中得到了越來越廣泛的應用。

在 jdk 中提供了一個 Java 數字證書管理工具 keytool, 在 /jdk/bin 目錄下,通過這個工具可以自己生成一個數字證書,命令如下:

keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore sang.p12 -validity 365
  • -genkey

    創建新密鑰

  • -alias

    keystore 的別名

  • -keyalg

    使用加密算法 RSA, 一種非堆成加密算法

  • -keysize

    密鑰長度

  • -keystore

    生成密鑰存放位置

  • -validity

    密鑰的有效時間,單位:天

cmd 窗口中直接執行上述命令,生成密鑰,將生成的名爲 sang.p12 的文件複製到項目的根目錄下,然後在 application.properties 中做如下配置:

server.ssl.key-store=sang.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=123456
  • key-store

    表示密鑰文件名

  • key-alias

    表示密鑰別名

  • key-store-password

    cmd 命令執行過程中設定的密碼

配置成功後,啓動項目,輸入 https://localhost:8081/chapter02/hello 來訪問。由於證書是自己生成的不被瀏覽器認可,需要手動添加信任即可。

此時,如果再以 http://localhost:8081/chapter02/hello 訪問,則會訪問失敗 This combination of host and port requires TLS.

因爲 SpringBoot 不支持同時在配置中啓動 HTTP 和 HTTPS。這個時候可以配置請求重定向,將 HTTP 請求重定向爲 HTTPS 請求。配置如下:

import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import org.apache.catalina.Context;

@Configuration
public class TomcatConfig {
    @Bean
    TomcatServletWebServerFactory tomcatServletWebServerFactory(){
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory(){

            @Override
            protected  void postProcessContext(Context context){
                SecurityConstraint constraint  = new SecurityConstraint();
                constraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection = new SecurityCollection();
                collection.addPattern("/*");
                constraint.addCollection(collection);
                context.addConstraint(constraint);
            }
        };
        factory.addAdditionalTomcatConnectors(createTomcatConnector());
        return  factory;
    }

    /**
     * 監聽 http://localhost:8081/ 端口,重定向到 https://localhost:8080/
     * @return
     */
    private Connector createTomcatConnector(){
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(8081);
        connector.setSecure(false);
        connector.setRedirectPort(8080);
        return connector;
    }
}

Properties 配置

SpringBoot 中採用了大量的自動化配置,但也不可避免會有一些需要手動配置。

application.properties 配置文件一共可以出現在 4 個位置,加載優先級從依次降低:

  • 項目根目錄下 config 文件夾中
  • 項目根目錄下
  • classpath 下的 config 文件夾中
  • classpath 下

類型安全配置屬性

Spring 提供了 @Value 註解以及 EnvironmentAware 接口來將 Spring Environment 中的數據注入到屬性上,SpringBoot 對此進一步提出了類型安全配置屬性,這樣即使在數據量十分大的情況下,也可以更加方便的將配置文件中的數據注入 Bean

可以在 application.properties 中添加一段配置

book.name=SpringBoot開發實戰
book.author=王松
book.price=65

將這一段配置數據注入 Bean

package org.sang.Bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "book")
public class Book {
    private String name;
    private String author;
    private Float price;

    /* getter & setter */
}

如果報錯

spring boot Configuration Annotation Proessor not found in classpath

可以在 pom.xml 中加入如下代碼後重新 build

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
 <optional>true</optional>
</dependency>

最後,創建一個 BookController 進行測試:

import org.sang.Bean.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BookController {
    @Autowired
    Book book;

    @GetMapping("/book")
    public String book(){
        return book.toString();
    }
}

啓動項目,訪問 https://localhost:8080/book

Warning: 可能會發現,漢字,亂碼了???

可以在 IDEA 的 setting --> file encoding 中,這是 global encoding 和 project encoding 爲 UTF-8,default encoding for properties files 也爲 UTF-8,並勾選 Transparent native-to-ascii conversion 即可。

至此,SpringBoot 環境搭建和基礎配置就完成了,接下來,就可以使用 SpringBoot 環境整合一些其他技術進行開發了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章