使用 StopWatch 优雅打印执行耗时

import org.springframework.util.StopWatch;

public class SpringStopWatchExample3 {

    public static void main (String[] args) throws InterruptedException {
        StopWatch sw = new StopWatch();
        sw.start("A");
        Thread.sleep(500);
        sw.stop();
        sw.start("B");
        Thread.sleep(300);
        sw.stop();
        sw.start("C");
        Thread.sleep(200);
        sw.stop();
        System.out.println(sw.prettyPrint());
    }
}

输出
StopWatch '': running time (millis) = 1031
-----------------------------------------
ms     %     Task name
-----------------------------------------
00514  050%  A
00302  029%  B
00215  021%  C:

更多用法

不同的打印结果

getTotalTimeSeconds() 获取总耗时秒,同时也有获取毫秒的方法

prettyPrint() 优雅的格式打印结果,表格形式

shortSummary() 返回简短的总耗时描述

getTaskCount() 返回统计时间任务的数量

getLastTaskInfo().getTaskName() 返回最后一个任务TaskInfo对象的名称

更多查看文档

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/StopWatch.html

查看pom中依赖树

idea中通过Maven Integration插件在pom文件单击右键选择 Diagrams -> Show Dependencies查看依赖关系树,在依赖关系树页面使用 CTRL + F 打开查询功能,打开查询功能后直接输入需要查询的字母即可开始查询(查询输入框不会主动出现,需输入任意字母开始查询后才会出现)

springboot通过@ControllerAdvice注解处理Controller返回的数据

import com.thsware.framework.service.dto.ApiResult;
import com.thsware.framework.web.rest.ApiResource;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.lang.reflect.Method;

// 处理Controller返回的数据,主要用于将返回的数据写入request是的拦截器能间接取到Controller返回的数据
@ControllerAdvice
public class ApiResponseBody implements ResponseBodyAdvice<Object> {

    // 用于判断是否需要执行beforeBodyWrite
    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        Method method = methodParameter.getMethod();
        return method.getDeclaringClass().getName().equals(ApiResource.class.getName());
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        // 判断Controller返回的数据类型是否是ApiResult
        if (o instanceof ApiResult) {
            // 将Controller返回的数据写入request用于后续处理
            ServletServerHttpRequest request = (ServletServerHttpRequest) serverHttpRequest;
            request.getServletRequest().setAttribute("x-thsbim-result", o);
        }
        return o;
    }
}

springboot中通过@Async注解启用异步

使用@EnableAsync启用@Async

如果程序无法启动可以使用@EnableAsync(proxyTargetClass=true)

如果被@Async注解的方法和调用它的方法处于同一个类中不会异步执行

正则表达式字符串替换

public static void main(String[] args){
    String te = "{replacecontent}";  //字符串替换的内容
    String reg = "p=(.*?)&tr";       //替换内容所对应的正则
    String content="https://0.0.0.0:8080/abc-test-reg/test/index?p=0123456&trigger=2&param=0d243b2-cd56-11e-abu9-05692e327ff";      //要替换的字符串
    StringBuilder operatorStr=new StringBuilder(content);
    Pattern p = Pattern.compile(reg);
    Matcher m = p.matcher(operatorStr);
    if (m.find()){
        //使用分组进行替换
        operatorStr.replace(m.start(1),m.end(1),te);
    }
    System.out.println(operatorStr.toString());
}

// 结果
// https://0.0.0.0:8080/abc-test-reg/test/index?p={replacecontent}&trigger=2&param=0d243b2-cd56-11e-abu9-05692e327ff

带token下载文件

public File downloadSvfzip(String objectId, String token) throws Exception {
    URL url = new URL(serverUrl + svfzipUrl + objectId);
    URLConnection conn = url.openConnection();
    conn.setRequestProperty("Token", token);
    InputStream inStream = conn.getInputStream();
    File result = File.createTempFile(objectId, ".tmp");
    IOUtils.copy(inStream, new FileOutputStream(result));
    return result;
}

将File转换成MultipartFile模拟文件上传(不会爆内存)

依赖

<dependencies>
    <!-- Apache Commons FileUpload -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>

    <!-- Apache Commons IO -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.8.0</version>
    </dependency>
</dependencies>

代码

public static MultipartFile FileToMultipartFile(File file) throws IOException {
    // 创建DiskFileItemFactory对象
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 使用DiskFileItemFactory创建FileItem对象
    FileItem fileItem = factory.createItem(
        "file", // 表单字段名
        "text/plain", // 内容类型
        false, // 是否为表单字段
        file.getName() // 文件名
    );
    // 将File对象的内容复制到FileItem中
    OutputStream out = fileItem.getOutputStream();
    FileUtils.copyFile(file, out);
    out.flush();
    out.close();
    // 创建CommonsMultipartFile对象
    return new CommonsMultipartFile(fileItem);
}
最后修改:2023 年 12 月 07 日
如果觉得我的文章对你有用,请随意赞赏