Spring Boot实用小技巧3 - 第525篇

2024-08-27 00:04
文章标签 java 技巧 spring 实用 boot 525

本文主要是介绍Spring Boot实用小技巧3 - 第525篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

《国内最全的Spring Boot系列之七》

SpringBoot异常处理机制之自定义404、500错误提示页面 - 518篇

SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇

SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 -  第520篇

SpringBoot多例模式,在同一个类中注入两次是否是同一个对象 – 一不小心就会写出一个重大BUG!!- 521篇

SpringBoot基本原理,轻松应对面试官 - 第522篇

Spring Boot实用小技巧 -  - 第523篇

Spring Boot实用小技巧2 - 第524篇

导读

这一节再度带来一系列实用小技巧,当你将这些小技巧收入囊中,无论是应对工作中的特殊要求,还是对项目进行优化升级,都能游刃有余。

技巧一:动态修改日志级别

通过org.springframework.boot.logging.LoggingSystem提供的api即可。

主要是调用如下的代码即可进行修改:

loggingSystem.setLogLevel(null, LogLevel.DEBUG);

技巧二:动态注册静态资源

通常情况下,一般都是在配置文件中或者自定义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\\") ;  }}

以上方式都是实现配置或代码中定义好,这都需要重启服务,无法做到实时生效。要想实时生效可以通过如下方式动态注册:

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

通过如上方式动态注册静态资源,你也可以对相应的静态资源进行删除。

技巧三:统计接口调用耗时

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

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

@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属性反应的就是这个请求耗时情况。

技巧四:配置文件信息加密

比如我们配置文件中的一些账号和密码,都应该是密文保存的。

因此这次使用了一个开源组件来实现加密与解密,并且对 SpringBoot 非常友好只需要几段代码即可完成。

(1)• 首先根据加密密码将需要加密的配置加密为密文。

(2)•替换原本明文保存的配置。

(3)• 再使用时进行解密。

使用该包也只需要引入一个依赖即可:

<dependency>    <groupId>com.github.ulisesbocchio</groupId>    <artifactId>jasypt-spring-boot-starter</artifactId>    <version>3.0.4</version></dependency>

具体更多关于jasypt的知识,可以关注公众号「SpringBoot」回复关键词[431],查看文章:

《SpringBoot配置文件内容加密,实现敏感信息保护 - 第431篇》

技巧五:设置网站图标

原来我们在使用tomcat开发时,设置网站图片时,即icon图标时,一般都是直接替换root包下的favicon.ico替换成自己的,或者在网页的头部设置link的ref为icon然后设置其href值。而在SpringBoot中,替换图片也是很简单的,只需要将自定义图片放置在静态资源目录下即可,即默认有static、public、resources、/META-INF/resources或者自定义的静态目录下即可。

技巧六:高效日志:使用Lombok简化日志记录

Lombok是一款Java工具,能通过注解形式简化Java代码开发,特别是日志记录部分。

使用方法:

在pom.xml中添加依赖:

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId></dependency>

启用日志记录:

import lombok.extern.slf4j.Slf4j;@Slf4jpublic class MyClass {    public void logSomething() {        log.info("This is an info log");    }}

历史文章(文章累计520+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

《国内最全的Spring Boot系列之六》

《国内最全的Spring Boot系列之七》

Spring Boot整合ElasticSearch实战 - 第511篇

Transaction rolled back because it has been marked as - 第512篇

五音不全也浪漫,521清华学霸为爱人写歌 - 第513篇

一文讲清楚SpringBoot项目打包jar后运行报错template might not exist - 第514篇

idea springboot woff/woff2/eot/ttf/svg等小图标不显示的问题 - 第515篇

Noisee AI中文站网页版 AI 音乐生成视频全新登场,快来抢先体验——国内第一个登场的中文站来袭  - 516篇

Spring的SmartLifecycle可以没用过,但没听过就不好了!- 第517篇

SpringBoot异常处理机制之自定义404、500错误提示页面 - 518篇

SpringBoot 中多例模式的神秘世界:用法区别以及应用场景,最后的灵魂拷问会吗?- 第519篇

SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 -  第520篇

SpringBoot多例模式,在同一个类中注入两次是否是同一个对象 – 一不小心就会写出一个重大BUG!!- 521篇

SpringBoot基本原理,轻松应对面试官 - 第522篇

Spring Boot实用小技巧 -  - 第523篇

Spring Boot实用小技巧2 - 第524篇

这篇关于Spring Boot实用小技巧3 - 第525篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110059

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直