当前位置:首页 > 科技  > 软件

请一定掌握SpringBoot这四个高级开发技巧

来源: 责编: 时间:2024-06-14 08:46:27 244观看
导读环境:SpringBoot3.2.51. 输出所有Controller接口信息有时,为了更便捷地排查问题,我们可能希望在容器启动时能够打印出当前项目中所有的Controller接口信息。这样做可以提供一个清晰的项目接口概览,从而帮助我们更快速地定

环境:SpringBoot3.2.5U9p28资讯网——每日最新资讯28at.com

1. 输出所有Controller接口信息

有时,为了更便捷地排查问题,我们可能希望在容器启动时能够打印出当前项目中所有的Controller接口信息。这样做可以提供一个清晰的项目接口概览,从而帮助我们更快速地定位和解决可能出现的问题。U9p28资讯网——每日最新资讯28at.com

方式1

logging:  level:    web: trace

输出结果U9p28资讯网——每日最新资讯28at.com

图片图片U9p28资讯网——每日最新资讯28at.com

虽然达到了目的,但是这将所有web分组的日志都进行输出了,日志信息非常多,我们所期望的仅仅是输出Controller相关的信息。U9p28资讯网——每日最新资讯28at.com

方式2

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

输出结果U9p28资讯网——每日最新资讯28at.com

图片图片U9p28资讯网——每日最新资讯28at.com

通过上面的设置,此时日志信息只输出了Controller接口,其它的都按照默认的输出。U9p28资讯网——每日最新资讯28at.com

2. 统计接口调用耗时

一般我们在不借助第三方工具的情况下,打印接口耗时通常会在接口处理逻辑的开始和结束位置分别记录当前时间戳,然后计算时间差来获取耗时,如下示例:U9p28资讯网——每日最新资讯28at.com

@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在这些过程执行完成后是发布了一个事件,我们可以通过监听该事件来获取整个请求生命周期的耗时,如下示例:U9p28资讯网——每日最新资讯28at.com

@Componentpublic 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属性反应的就是这个请求耗时情况。U9p28资讯网——每日最新资讯28at.com

图片图片U9p28资讯网——每日最新资讯28at.com

是不是非常的方便及准确!U9p28资讯网——每日最新资讯28at.com

3. 动态注册静态资源

通常情况下,一般都是在配置文件中或者自定义WebMvcConfigurer进行静态资源的配置及注册,如下示例:U9p28资讯网——每日最新资讯28at.com

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

以上是默认的路径,我们可以在这自定义自己的今天资源路径。如下添加文件系统目录U9p28资讯网——每日最新资讯28at.com

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

也可以通过编程的方式注册静态资源U9p28资讯网——每日最新资讯28at.com

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

以上方式都是实现配置或代码中定义好,这都需要重启服务,无法做到实时生效。要想实时生效可以通过如下方式动态注册U9p28资讯网——每日最新资讯28at.com

@RestControllerpublic 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";  }}

通过如上方式动态注册静态资源,你也可以对相应的静态资源进行删除。U9p28资讯网——每日最新资讯28at.com

4. 容器启动完成操作

当你希望Spring容器正确初始化加载完成以后,执行一些操作,那么你可以监听ContextRefreshedEvent事件。该实际的触发是在refresh方法执行的最后阶段。U9p28资讯网——每日最新资讯28at.com

@Componentpublic class ContextRefreshedListener implements ApplicationListener<ContextRefreshedEvent> {  @Override  public void onApplicationEvent(ContextRefreshedEvent event) {    System.out.println("上下文刷新完成...") ;    // TODO  }}

通过监听该事件,你可以在这里实现你自己的逻辑。U9p28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-93678-0.html请一定掌握SpringBoot这四个高级开发技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 实力与颜值并存,华为 PC 双新品荣登 CHIP 榜单前三

下一篇: 对比Word和Markdown,为什么LaTeX更受专业人士欢迎

标签:
  • 热门焦点
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • Automa-通过连接块来自动化你的浏览器

    1、前言通过浏览器插件可实现自动化脚本的录制与编写,具有代表性的工具就是:Selenium IDE、Katalon Recorder,对于简单的业务来说可快速实现自动化的上手工作。Selenium IDEKat
  • 一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • iQOO Neo8 Pro抢先上架:首发天玑9200+ 安卓性能之王

    经过了一段时间的密集爆料,昨日iQOO官方如期对外宣布:将于5月23日推出全新的iQOO Neo8系列新品,官方称这是一款拥有旗舰级性能调校的作品。随着发布时
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top