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
依賴,因此在開啓了自動化配置之後會自動進行Spring
和Spring 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
)
- 輸入基本信息
- 選擇依賴
- 選擇項目路徑
- 新建(選擇
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
配置中,可以內置Tomcat
、Jetty
、Undertow
、Netty
等容器。當添加了
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
環境整合一些其他技術進行開發了。