文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-29 21:41

关注

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 {


  @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 {


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

通过监听该事件,你可以在这里实现你自己的逻辑。

来源:Spring全家桶实战案例源码内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯