1. 什么是配置文件
????????在我們的計算機上諸如 C:/Users,C:/Windows,.config,.xml 都是配置文件,配置文件主要為了解決硬編碼帶來的問題。硬編碼是將數據直接寫在程序的源代碼中,代碼寫死后再想改變就很麻煩。因此,將可能改變的信息放在一個集中的文件中,程序啟動后讀取其中的數據。
2. SpringBoot 對配置文件的支持
????????SpringBoot 約定配置文件應放在 resources 目錄下,文件名應使用 application,格式為 .yml 或 .properties。properties 是早期的配置文件格式,也是 SpringBoot 約定的默認格式。當 yml 文件和 properties 文件共存時,properties 文件優先級更高。實際開發中應使用統一的配置文件格式,維護成本更低。
3. properties 文件格式
? ? ? ? 鍵值對形式,key 和 value 之間 = 分割
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
? ? ? ? 使用 @Value 注解在程序中注入配置文件中的數據。?
name=li
@Value("${name}")public String name;
4. yml 文件格式
? ? ? ? properties 文件格式中有大量冗余信息,yml 文件是一種更新型和輕量的文件格式。yml 文件采用樹形結構,key 和 val 之間使用冒號加空格,空格不可省略。
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=falseusername: rootpassword: root
? ? ? ?使用 yml 配置不同類型的單個數據。依然使用 @Value 注入數據。
example:v1: Hello #字符串不需要加引號v2: truev3: falsev4: 3.12723v5: ~ #表示nullv6: '' #表示空字符串v7: "Hello \n yml" #加雙引號后該子串中的特殊字符會生效,此時會換行
? ? ? ? ?使用 yml 配置對象。此時需要使用 @ConfigurationProperties 注解注入。被注入 val 的 bean 必須提供 Setter 方法,因為?Setter 方法?是 Spring 在綁定過程中通過反射調用的入口,框架會嘗試將配置的鍵名與 Setter 方法名匹配。如果沒有 Setter,Spring 無法通過反射直接修改 private?字段(即使字段是 public,也不符合封裝原則)。
student:name: liage: 18hobby: # list必須依賴對象才能配置- football- boxing- runningscore: # 可以使用map獲取,也可以單個獲取math: 90physics: 88
@Data
@Configuration
@ConfigurationProperties("student")
public class User1 {public String name;public Integer age;public List<String> hobby;public Map<String, String> score;
}
5. SpringBoot 日志
5.1 為何要使用日志
? ? ? ? 通過日志監控系統的運行狀態。
? ? ? ? 使用日志進行數據采集,推薦排序。算法人員通過分析采集的數據,訓練模型,為用戶做推薦。
? ? ? ? 日志一定程度上保障網絡安全。比如一些內部的用戶信息泄露,如果記錄了日志就可以為調查提供證據。
5.2 門面模式與 SLF4J
? ? ? ? 門面模式又稱為外觀模式,其特征是使用一個統一的高層接口,來訪問其下眾多子系統中的接口,這使得每個子系統的調用都更具規范性和統一性,降低調用者的學習成本。每個子系統都不是一個單獨的類,而是類的集合,子系統可以被獨立使用。子系統不知道高層接口(門面)的存在,站在子系統的角度上看,門面只是另一個客戶端。
? ? ? ? 即將學習的日志系統 SLF4J 就是一個門面,而不是真正的日志實現,它是為許多日志框架做出的統一規范。因此單獨使用 SLF4F 是沒有任何意義的,它在底層需要和真正的日志框架配合,真正的日志實現包括 log4j、JUL 和 logback,這些框架已經被封裝在門面之下了。SLF4J 使我們的代碼獨立于任何一個特定的日志 API。
5.3?日志具體格式
? ? ? ? 日志級別:
? ? ? ? FATAL:致命信息,說明此時系統已經一定程度上不可用,一個進程的生命周期中理論上最多出現一次 FATAL。
? ? ? ? ERROR:錯誤信息,級別較高,但系統可以繼續運行
? ? ? ? WARN:警告信息,需要注意的問題
? ? ? ? INFO:普通信息,用于記錄程序正常的運行信息
? ? ? ? DEBUG:調試信息,調試時的關鍵信息打印
? ? ? ? TRACE:追蹤信息,顆粒度最細的信息打印,并不常用
? ? ? ? 日志級別是開發人員自行設置的,供開發人員檢測使用,并不是測試中的 Bug 級別。越高級別的日志會給開發者回饋更少的消息。
5.4 基礎使用
? ? ? ? 使用 slf4j 包下的 LoggerFactory 就可以輕松創建日志對象,使用 Logger 類接收。需要傳遞一個參數作為日志名稱,建議填入源類名以方便追蹤問題所在地。
private static Logger logger = LoggerFactory.getLogger(Demo4.class);logger.info("此處為輸入日志的內容...")
? ? ? ? 測試不同級別的日志:每當客戶端調用該方法,該方法都會在控制臺打印一次日志。日志輸出的默認級別是 INFO,因此 DEBUG 和 TRACE 級別的日志不會被打印。
5.5 日志的靈活配置?
? ? ? ? 使用 logging.level 配置日志輸出級別,root 作用于整個項目,同級添加某個類路徑以特指該類下日志輸出的級別。
? ? ? ? 日志持久化。若同時配置兩個配置項則以 name 為準。
? ? ? ? 隨著日志文件越來越大,需要對其進行分割。默認情況下日志文件超過 10M 就會進行分割。如圖為了方便演示設置文件上限為 1KB,企業開發通常設置 500M 左右,此處沒有嚴格標準。默認情況下生成壓縮文件(.gz),可以通過更改文件名格式來更改。
? ? ? ? 此時生成了普通文本文件。
? ? ? ? 日志還有諸多可以自定義的部分,比如日志打印格式,顏色等等。
????????lombok 為我們提供更簡單的日志對象獲取方法。使用 @Slf4j 注解代替手動從 LoggerFactory 取對象的操作,自動生成名為 log 的對象。
6. 單元測試
? ? ? ? 在 SpringBoot 項目需要針對某個方法進行測試時,首先使用 IDEA 自動生成測試類。
????????
?????????設計單元測試要求每個用例之間互相獨立,互不干擾。setUp 方法在每個測試方法執行前都會執行,用于準備測試需要的環境,tearDown 方法在每個測試方法執行后都會執行,用于消除方法執行過程中產生的中間結果。
????????
? ? ? ? 測試類中的 @SpringBootTest 注解會自動加載 Spring 的運行環境,@BeforeEach 注解聲明 setUp 方法,@AfterEach 注解聲明 tearDown 方法,@Test 注解聲明測試方法。除此之外,測試類與普通類沒有太大區別,可以在其中任意添加需要的屬性,或使用 Autowired。也可以寫不帶 Test 注解的普通方法,用于準備不同的測試用例。
? ? ? ? 單元測試非常重要,單元測試做得越完善,后期出現問題,查找問題的成本越低。