目錄
一、創建一個SpringBoot程序
二、SpringBoot的特點
①主要特點
②其他特點
?③熱部署
啟動熱部署
關閉熱部署
三、SpringBoot的配置文件
①SpringBoot三種配置文件的格式(以設置端口號為例):
②配置文件的優先級
③常見配置項
1.配置數據源
3.設置運行日志的顯示級別 ?
④讀取yaml和yml文件中的數據
1.讀取單一數據
2.讀取全部數據
3.讀取對象數據
⑤多種環境開發(yaml單文件版)
1.配置激活選項
2.在不同的配置環境下添加英文三個橫杠(---)可以讓idea區分不同的環境
四、logback記錄日志
①logback初始化步驟
②使用日志文件記錄日志
1.導入依賴:spring-boot-starter-logging
2.在配置文件中設置日志文件的名字
3.創建一個logback的配置文件logback.xml,日志輸出到哪個目錄的哪個文件下,輸出的格式輸出的日志級別
4.創建log對象去寫日志,檢測是否能夠打印運行日志
五、配置過濾器,攔截器,全局異常捕獲
①使用SpringBoot的配置類來添加過濾器
1.編寫Filter類
2.使用SpringBoot提供的FilterRegistrationBean來對Filter進行配置
3.測試
②配置攔截器
1.實現一個Intercepter類
2.寫一個配置類
3.測試
?編輯
③設置全局捕獲異常
1.創建一個異常類,在其class上注解@ControllerAdvice,在其方法上加上注解@ExceptionHandler(value=Exception.class)
2.測試,做一個會讓程序報錯的動作,去查看是否會顯示“頁面無法加載”
一、創建一個SpringBoot程序
在之前寫過一篇如何創建SpringBoot程序,兩種方式,方法1:通過maven創建SpringBoot項目
方法2:使用Spring Initialzr創建一個SpringBoot項目(缺點:當創建項目時網絡中斷,會導致程序有部分缺失,并且在程序初始加載的時候不會報錯,在后續的項目進程中可能會無法發現報錯的原因)
SpringBoot--入門、創建一個SpringBoot項目、測試_springboot創建測試類-CSDN博客
二、SpringBoot的特點
①主要特點
- 為基于Spring的開發提供更快的入門體(不需要寫測試類,有啟動類,不用配置tomcat)
- 開箱即用,沒有代碼生成,也無需XML配置。同時也可以修改默認值來滿足特定的需求(例如:server.port即端口號的默認值為8080,SpringBoot可以修改這個值)
- 提供了一些大型項目中常見的非功能性特性,如嵌入式服務器(Tomcat)、安全、指標,健康檢測、外部配置等
- SpringBoot不是對Spring功能上的增強,而是提供了一種快速使用Spring的方式
②其他特點
- SpringBoot在項目創建時會添加一個<parent>標簽,其意義是幫助開發者進行統一的項目版本管理
- SpringBoot使用starter可以幫助開發者減少依賴配置(
二者的區別:(一)starter是一個坐標中定了若干個坐標,以前寫多個的,現在寫一個,是用來減少依賴配置的書寫量的。
(二)parent是定義了幾百個依賴版本號,以前寫依賴需要自己手工控制版本,現在由SpringBoot統一管理,這樣就不存在版本沖突了,是用來減少依賴沖突的。
)
- 這個
spring-boot-dependencies
中定義了兩組信息:第一組是各式各樣的依賴版本號屬性,第二組是各式各樣的依賴坐標信息
?③熱部署
什么是熱部署?
在服務器啟動后改動程序不需要再重啟服務器,服務器會自己悄悄把更新后的程序加載一遍
啟動熱部署
第一步:在pom.xml文件中導入依賴
第二步:構建項目,可以使用快捷鍵(Ctrl+F9)激活此功能
以上為手動開啟熱部署,現在介紹如何自動開啟熱部署
第一步:打開【File】,選擇【settings...】,在面板左側的菜單中找到【Compile】選項,然后勾選【Build project automatically】,意思是自動構建項目
第二步:允許在程序運行時進行自動構建(因為我的idea為2023版,所以介紹的是2023版的方式)
勾選:settings->Advanced Settings->編譯器->編譯器中的第一個選項,如下圖,點擊應用
關閉熱部署
? ? ? ? 線上環境運行時是不可能使用熱部署功能的,所以需要強制關閉此功能,通過配置可以關閉此功能。
spring:devtools:restart:enabled: false
? ? ? ? 如果擔心配置文件層級過多導致相符覆蓋最終引起配置失效,可以提高配置的層級,在更高層級中配置關閉熱部署。例如在啟動容器前通過系統屬性設置關閉熱部署功能。
@SpringBootApplication public class Application {public static void main(String[] args) {System.setProperty("spring.devtools.restart.enabled","false");SpringApplication.run(Application.class);} }
三、SpringBoot的配置文件
①SpringBoot三種配置文件的格式(以設置端口號為例):
properties格式
yml格式
yaml格式
application.properties(properties格式)
server.port=8080
application.yml(yml格式)
server:port: 8081
application.yaml(yaml格式)
server:port: 8082
②配置文件的優先級
測試:在三種配置文件中分別設置不同的端口號,看哪一個端口號訪問時會生效,則哪一個配置文件的優先級更高
application.yaml
application.properties
application.yml
測試成功,8082端口成功顯示數據,即表示application.properties文件的端口生效了
測試失敗,則表示application.yaml文件的端口號無法生效
但是這就表示該配置文件的其他配置沒有生效嗎,事實表明生效了,在.yaml文件中配置了一個關閉運行日志圖表?,控制臺則并沒有打印出日志圖標,所以得出結論:每個配置文件中的項都會生效,只不過如果多個配置文件中有相同類型的配置會優先級高的文件覆蓋優先級的文件中的配置。如果配置項不同的話,所有的配置項都會生效。
關于其他的配置項,可以去SpringBoot官網上了解
打開查看附錄中的Application Properties就可以獲取到對應的配置項了,網址奉上:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
③常見配置項
在編寫配置文件時,我們可以選擇更關鍵的單詞,idea會提示需要的配置項
1.配置數據源
# 配置Spring Boot應用的數據庫源 spring:datasource:# 數據庫連接URL,包含數據庫的地址、端口、數據庫名以及連接參數# 參數包括:useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC# 說明:使用Unicode編碼,字符編碼為UTF-8,不使用SSL,服務器時區為UTCurl: jdbc:mysql://localhost:3306/myd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC# 數據庫用戶名username: root# 數據庫密碼password: 123456# 數據庫驅動類名driver-class-name: com.mysql.cj.jdbc.Driver# 數據源類型,這里使用的是阿里巴巴的Druid數據源type: com.alibaba.druid.pool.DruidDataSource
打datasource會更快出現需要的配置標簽
2.關閉日志圖標(banner)
spring:main:banner-mode: off
能夠關閉運行日志中的此圖標
3.設置運行日志的顯示級別 ?
#日志配置 logging:level:root: infocom.myd: debug
能夠顯示數據庫語句
④讀取yaml和yml文件中的數據
1.讀取單一數據
? ? ? ?yaml中保存的單個數據,可以使用Spring中的注解@Value讀取單個數據,屬性名引用方式:${一級屬性名.二級屬性名……}
2.讀取全部數據
? ? ? ?讀取單一數據可以解決少量數據讀取的問題,但是如果數據多的話,這樣寫會很麻煩,SpringBoot提供了一個對象,能夠把所有的數據都封裝到這一個對象中,這個對象叫做Environment,使用自動裝配注解可以將所有的yaml數據封裝到這個對象中
3.讀取對象數據
? ? ? ? 首先定義一個對象,并將該對象納入Spring管控的范圍,也就是定義成一個bean,然后使用注解@ConfigurationProperties指定該對象加載哪一組yaml中配置的信息。
⑤多種環境開發(yaml單文件版)
? ? ? ? 什么是多環境?其實就是說你的電腦上寫的程序最終要放到別人的服務器上去運行。每個計算機環境不一樣,這就是多環境。常見的多環境開發主要兼顧3種環境設置,開發環境——自己用的,測試環境——自己公司用的,生產環境——甲方爸爸用的。因為這是絕對不同的三臺電腦,所以環境肯定有所不同,比如連接的數據庫不一樣,設置的訪問端口不一樣等等。
1.配置激活選項
spring:profiles:active:?dev
2.在不同的配置環境下添加英文三個橫杠(---)可以讓idea區分不同的環境
spring:profiles:active: prod # 啟動prod --- spring:profiles: prod server:port: 8080 --- spring:profiles: dev server:port: 8081 --- spring:profiles: test server:port: 8082
四、logback記錄日志
日志就是記錄程序運行的信息,主要作用如下:
- 編程期調試代碼
- 運營期記錄信息
- 記錄日常運營重要信息
- 記錄應用報錯信息
- 記錄運維過程數據
默認情況下,Spring Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺
Logback繼承自log4j。Logback的架構非常的通用,適用于不同的使用場景。
①logback初始化步驟
logback會在類路徑下尋找名為logback-test.xml的文件
如果沒有找到,logback會繼續尋找名為logback.groovy的文件
如果沒有找到,logback會繼續尋找名為logback.xml的文件
如果沒有找到,將會在類路徑下尋找文件META-INFO/services/ch.qos.logback.classic.spi.Configurator,該文件的內容為實現了Configurator接口的實現類的全限定類名
如果以上都沒有成功,logback會通過BasicConfigurator為自己進行配置,并且日志將會全部在控制臺打印出來
②使用日志文件記錄日志
1.導入依賴:spring-boot-starter-logging
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><version>2.5.2</version> </dependency>
2.在配置文件中設置日志文件的名字
3.創建一個logback的配置文件logback.xml,日志輸出到哪個目錄的哪個文件下,輸出的格式輸出的日志級別
<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 輸出到控制臺 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 輸出到文件 --><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>log/demo.log</file><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/demo.%d{yyyy-MM-dd}.log</fileNamePattern></rollingPolicy></appender><!-- 設置日志輸出級別 --><root level="INFO"><appender-ref ref="console" /><appender-ref ref="file" /></root> </configuration>
注意:
- spring boot默認會加載classpath:logback-spring.xml或者classpath:logback-spring.groovy或者:classpath:logback.xml
- 自定義配置文件(不要使用logback-logback.xml這個來命名,否則spring boot將不能完全實例化 ),文件格式為:
logging: config: classpath:logback-suke.xml
4.創建log對象去寫日志,檢測是否能夠打印運行日志
import com.minyudie.spring_boot_basic1.pojo.Datasource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/test") public class TestController {@Autowiredprivate Datasource datasource;private static final Logger logger =LoggerFactory.getLogger(TestController.class);@PostMapping("/hello")public String hello() {logger.info("I'm logger");return "hello";}}
使用apifox測試網址,使用post方法訪問:
網址正確,訪問成功!!!
控制臺輸出:
日志文件中成功記錄到:
五、配置過濾器,攔截器,全局異常捕獲
①使用SpringBoot的配置類來添加過濾器
1.編寫Filter類
import jakarta.servlet.*; import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("MyFilter doFilter");}@Overridepublic void destroy() {Filter.super.destroy();} }
2.使用SpringBoot提供的FilterRegistrationBean來對Filter進行配置
import com.minyudie.spring_boot_basic1.filter.MyFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class FilterConfig {@Beanpublic FilterRegistrationBean<MyFilter> myFilter(){FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new MyFilter());registrationBean.addUrlPatterns("/*");registrationBean.setName("myFilter");registrationBean.setOrder(1);return registrationBean;} }
3.測試
成功執行!!
②配置攔截器
1.實現一個Intercepter類
這里我們需要實現HandlerInterceptor這個接口,這個接口包括三個方法,preHandle是請求執行前執行的,postHandler是請求結束執行的
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;public class MyIntercept implements HandlerInterceptor {private long start;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {start = System.currentTimeMillis();return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("耗時:" + (System.currentTimeMillis() - start));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {} }
2.寫一個配置類
import com.minyudie.spring_boot_basic1.intercept.MyIntercept; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration public class InterceptConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyIntercept()).addPathPatterns("/user");} }
3.測試
沒有出現hello,表示已被攔截
③設置全局捕獲異常
1.創建一個異常類,在其class上注解@ControllerAdvice,在其方法上加上注解@ExceptionHandler(value=Exception.class)
import jakarta.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice public class GlobleException {Logger logger = LoggerFactory.getLogger(GlobleException.class);@ExceptionHandler(value = Exception.class)@ResponseBodypublic String defaultErrorHandler(HttpServletRequest request, Exception e) {logger.error("請求地址:{},發生異常:{}", request.getRequestURL(), e.getMessage());return "頁面無法加載";} }
2.測試,做一個會讓程序報錯的動作,去查看是否會顯示“頁面無法加載”
例如:輸入一個不存在的網址,查看是否會顯示我們想要的結果
測試成功!!
注意:
? ? ? ?在測試之前,我們需要把過濾器的過濾文件路徑改為不屬于我們需要測試的這個路徑,否則我們無法看到報錯,只會有"MyFilter doFilter"。