成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

請一定掌握SpringBoot這四個高級開發技巧

開發 前端
通過監聽ServletRequestHandledEvent事件,可以有效的獲取客戶端地址,請求的URL等完整的信息,其中ProcessingTimeMillis屬性反應的就是這個請求耗時情況。

環境:SpringBoot3.2.5

1. 輸出所有Controller接口信息

有時,為了更便捷地排查問題,我們可能希望在容器啟動時能夠打印出當前項目中所有的Controller接口信息。這樣做可以提供一個清晰的項目接口概覽,從而幫助我們更快速地定位和解決可能出現的問題。

方式1

logging:
  level:
    web: trace

輸出結果

圖片圖片

雖然達到了目的,但是這將所有web分組的日志都進行輸出了,日志信息非常多,我們所期望的僅僅是輸出Controller相關的信息。

方式2

logging:
  level:
    '[_org.springframework.web.servlet.HandlerMapping.Mappings]': debug

輸出結果

圖片圖片

通過上面的設置,此時日志信息只輸出了Controller接口,其它的都按照默認的輸出。

2. 統計接口調用耗時

一般我們在不借助第三方工具的情況下,打印接口耗時通常會在接口處理邏輯的開始和結束位置分別記錄當前時間戳,然后計算時間差來獲取耗時,如下示例:

@GetMapping("/time")
public Object time() throws Exception {
  Instant startTime = Instant.now() ;
  // TODO, 業務操作
  System.err.printf("接口耗時: %d 毫秒%n", (Duration.between(startTime, Instant.now()).toMillis())) ;
  return "take time" ;
}

上面統計了耗時情況,但是不夠準確,為了更準確地反應處整個請求處理過程的耗時,包括Spring框架根據請求查找對應的Controller、攔截器執行等操作,SpringMVC在這些過程執行完成后是發布了一個事件,我們可以通過監聽該事件來獲取整個請求生命周期的耗時,如下示例:

@Component
public class TakeTimeCountListener implements ApplicationListener<ServletRequestHandledEvent> {


  @Override
  public void onApplicationEvent(ServletRequestHandledEvent event) {
    Throwable failureCause = event.getFailureCause() ;
    if (failureCause != null) {
      System.err.printf("錯誤原因: %s%n", failureCause.getMessage()) ;
    }
    System.err.printf("請求客戶端地址:%s, 請求URL: %s, 請求Method: %s, 請求耗時: %d%n", 
        event.getClientAddress(), 
        event.getRequestUrl(), 
        event.getMethod(),
        event.getProcessingTimeMillis()) ;
  }
}

通過監聽ServletRequestHandledEvent事件,可以有效的獲取客戶端地址,請求的URL等完整的信息,其中ProcessingTimeMillis屬性反應的就是這個請求耗時情況。

圖片圖片

是不是非常的方便及準確!

3. 動態注冊靜態資源

通常情況下,一般都是在配置文件中或者自定義WebMvcConfigurer進行靜態資源的配置及注冊,如下示例:

spring:
  web:
    resources:
      static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

以上是默認的路徑,我們可以在這自定義自己的今天資源路徑。如下添加文件系統目錄

spring:
  web:
    resources:
      static-locations: ..., file:///d:/images/

也可以通過編程的方式注冊靜態資源

public class WebConfig implements WebMvcConfigurer {
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/images/**").addResourceLocations("file:///d:\\images\\") ;
  }
}

以上方式都是實現配置或代碼中定義好,這都需要重啟服務,無法做到實時生效。要想實時生效可以通過如下方式動態注冊

@RestController
public class RegController {
  @Resource
  private SimpleUrlHandlerMapping resourceHandlerMapping ;
  @Resource
  private ApplicationContext context ;


  // 如:requestURI=/s/**, path=d:/images/
  @GetMapping("")
  public Object reg(String requestURI, String path) throws Throwable {
    ResourceHttpRequestHandler handler = new ResourceHttpRequestHandler();
    handler.setLocations(List.of(new FileSystemResource(path))) ;
    handler.setApplicationContext(context) ;
    handler.afterPropertiesSet() ;
    resourceHandlerMapping.registerHandler(requestURI, handler);
    return "register success";
  }
}

通過如上方式動態注冊靜態資源,你也可以對相應的靜態資源進行刪除。

4. 容器啟動完成操作

當你希望Spring容器正確初始化加載完成以后,執行一些操作,那么你可以監聽ContextRefreshedEvent事件。該實際的觸發是在refresh方法執行的最后階段。

@Component
public class ContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {


  @Override
  public void onApplicationEvent(ContextRefreshedEvent event) {
    System.out.println("上下文刷新完成...") ;
    // TODO
  }
}

通過監聽該事件,你可以在這里實現你自己的邏輯。

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2024-10-10 11:49:27

2017-05-16 11:09:56

2025-05-26 02:22:00

2024-11-14 09:00:00

Python編程元編程

2019-10-29 14:54:20

Kafka消息系統分布式

2021-10-13 06:03:12

網絡帶寬卡頓

2020-06-17 09:19:26

網絡安全5G云盤

2022-10-08 15:32:24

Python開發技巧

2015-10-30 10:23:27

創業選擇思考問題

2015-04-15 11:31:14

智能硬件智能家居

2021-09-15 05:25:53

開發經驗程序員開發

2023-10-12 22:25:04

微服務Spring

2021-04-05 22:49:56

微信內存功能

2022-01-27 15:48:05

區塊鏈金融技術

2018-06-29 15:07:13

代碼工程師軟件開發

2016-12-09 13:08:25

2024-12-04 09:27:56

2015-08-13 10:49:33

WLAN無線局域網

2015-11-19 09:24:18

應用程序Docker容器化

2024-06-20 18:15:55

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人做爰www免费看视频网站 | 欧美激情精品久久久久久免费 | 欧美国产一区二区三区 | 中文字幕高清 | 五月免费视频 | 国产高清在线精品一区二区三区 | 粉嫩国产精品一区二区在线观看 | 中文字幕一区在线观看视频 | 亚洲第一成人影院 | 久久久成人免费一区二区 | 日韩欧美专区 | 久久视频精品 | 久久人| 亚洲色欲色欲www | 狠狠色综合网站久久久久久久 | 毛片一区二区三区 | 天天久久 | 国内精品久久久久久 | 欧美a级成人淫片免费看 | 国产在线中文字幕 | 国产精品久久久久久福利一牛影视 | 欧美精品一区二区三区在线播放 | 欧美日韩视频在线播放 | 中国美女av | 羞羞网站在线观看 | 久久久久久国产精品久久 | 精品国产乱码一区二区三 | 欧美videosex性极品hd | 99精品亚洲国产精品久久不卡 | 欧美日韩综合一区 | 福利视频一区二区 | 99久9 | 国产一级黄色网 | 色综合色综合色综合 | 久久综合一区二区三区 | 国产在线h | 欧美一区二区另类 | 国产精品久久久亚洲 | 91综合网| 精品久久亚洲 | 久久久一区二区 |