当前位置: 首页 > news >正文

干货分享:Spring中经常使用的工具类(提示开发效率)

环境:Spring5.3…30

1、资源工具类

ResourceUtils将资源位置解析为文件系统中的文件的实用方法。

读取classpath下文件

File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "logback.xml") ;
// ...

读取文件系统文件

file = ResourceUtils.getFile(ResourceUtils.FILE_URL_PREFIX + "D:\\pom.xml") ;

支持以下前缀的文件

public static final String CLASSPATH_URL_PREFIX = "classpath:";
public static final String FILE_URL_PREFIX = "file:";
public static final String JAR_URL_PREFIX = "jar:";
public static final String WAR_URL_PREFIX = "war:";

2、对象工具类

对象转数组

Object obj = new int[] {1, 2, 3, 4} ;
Object[] arr = ObjectUtils.toObjectArray(obj) ;

数组添加新元素

Integer[] obj = new Integer[] {1, 2, 3, 4} ;
Integer[] ret = ObjectUtils.addObjectToArray(obj, 5) ;

判断元素是否存在

Integer[] obj = new Integer[] {1, 2, 3, 4} ;
ObjectUtils.containsElement(ret, 5)

3、数组转换

转换到指定类型

Number n = 10D ;
NumberUtils.convertNumberToTargetClass(n, Double.class) ;

解析数字

Long ret = NumberUtils.parseNumber("10", Long.class) ;
System.out.println(ret) ;

4、Stream流操作

文件流复制到内存中

FileInputStream fis = new FileInputStream(new File("d:\\1.txt")) ;
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
// 文件内容读取到了baos中
StreamUtils.copy(fis, baos) ;

文本内容读取到内存中

StreamUtils.copy("abcdef", Charset.forName("UTF-8"), baos) ;

文件流直接转换为String

FileInputStream fis = new FileInputStream(new File("d:\\1.txt")) ;
String content = StreamUtils.copyToString(fis, Charset.forName("UTF-8")) ;

5、系统属性分析

解析系统属性占位符

String home = SystemPropertyUtils.resolvePlaceholders("${java.home}") ;
System.out.println(home) ;

6、集合工具类

在这里插入图片描述

7、AOP代理工具

在这里插入图片描述
判断是否为代理对象

static class UserService {}
public static void main(String[] args) {ProxyFactory factory = new ProxyFactory() ;factory.addAdvice(new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {return invocation.proceed() ;}});factory.setTarget(new UserService()) ;Object proxy = factory.getProxy() ;System.out.println(AopUtils.isAopProxy(proxy)) ;
}

判断切入点能否应用到目标类上(一般底层开发应用)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
static @interface Pack{}
static class UserService {@Packpublic void save() {}
}
// 自定义切入点
Pointcut pc = new Pointcut() {@Overridepublic MethodMatcher getMethodMatcher() {// 方法匹配;方法上是否有Pack注解return new AnnotationMethodMatcher(Pack.class) ;}@Overridepublic ClassFilter getClassFilter() {// 任意类return ClassFilter.TRUE ;}
};
boolean ret = AopUtils.canApply(pc, UserService.class) ;
System.out.println(ret) ;

获取代理类的原始对象

Object proxy = factory.getProxy() ;
AopProxyUtils.getSingletonTarget(proxy) ;

8、BeanFactory工具

在bean工厂上操作的方便方法,特别是在ListableBeanFactory接口上。
在这里插入图片描述
通过上面的方法可以获取指定BeanFactory中的bean或者包括在父工厂中的。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.pack") ;
BeanFactoryUtils.beanOfTypeIncludingAncestors(context, UserDAO.class)

9、注解工具

用于在AnnotatedElements(如:Method,Field,Class等)上查找注释、元注释和可重复注释的通用实用方法。AnnotatedElementUtils类提供了丰富的方法。

// 是否存在注解
AnnotatedElementUtils.hasAnnotation(UserService.class, Pack.class) ;

10.、Bean工具

BeanUtils类提供了,实例化bean、检查bean属性类型、复制bean属性等功能。
在这里插入图片描述


// 实例化对象
Person person = BeanUtils.instantiateClass(Person.class) ;
Person target = new Person() ;
// 属性copy
BeanUtils.copyProperties(person, target);
// 查找方法
BeanUtils.findMethod(Person.class, "getName") ;
// 根据方法名获取对应的属性
PropertyDescriptor pd = BeanUtils.findPropertyForMethod(Person.class.getDeclaredMethod("getName")) ;
System.out.println(pd.getName()) ;

11、数据验证

参数验证,在SpringMVC中都通过注解的方式。除了注解你也可以通过ValidationUtils工具类使用自定义的验证器进行参数的验证:

static class Person {private Integer age ;private String name ;
}
// 自定义验证器
static class PersonValidator implements Validator {@Overridepublic boolean supports(Class<?> clazz) {return Person.class.isAssignableFrom(clazz) ;}@Overridepublic void validate(Object target, Errors errors) {Person person = (Person) target ;if (person.age == null) {errors.reject("age.empty", "年龄不能为空") ;}} 
}
public static void main(String[] args) {Validator validator = new PersonValidator() ;Person target = new Person() ;BeanPropertyBindingResult errors = new BeanPropertyBindingResult(target, "person") ;ValidationUtils.invokeValidator(validator, target, errors) ;// 错误结果信息System.out.println(errors) ;
}

12.、XML解析

在这里插入图片描述

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
DocumentBuilder builder = factory.newDocumentBuilder() ;
Document document = builder.parse(new ClassPathResource("com/pack/main/utils/person.xml").getInputStream()) ;
Element element = document.getDocumentElement() ;
List<Element> elements = DomUtils.getChildElements(element) ;
elements.forEach(elt -> {System.out.println(elt.getTagName() + "=" + elt.getFirstChild().getNodeValue()) ;
}) ;

13、HTML转换

在这里插入图片描述

String ret = HtmlUtils.htmlEscape("<script>alert('脚本')</script>") ;
System.out.println(ret) ;
// 输出
&lt;script&gt;alert(&#39;脚本&#39;)&lt;/script&gt;

14、Web相关

在这里插入图片描述
来源:Spring全家桶实战案例源码

相关文章:

干货分享:Spring中经常使用的工具类(提示开发效率)

环境&#xff1a;Spring5.3…30 1、资源工具类 ResourceUtils将资源位置解析为文件系统中的文件的实用方法。 读取classpath下文件 File file ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX "logback.xml") ; // ...读取文件系统文件 file Resou…...

一文讲懂npm link

前言 在本地开发npm模块的时候&#xff0c;我们可以使用npm link命令&#xff0c;将npm 模块链接到对应的运行项目中去&#xff0c;方便地对模块进行调试和测试 用法 包链接是一个两步过程&#xff1a; 1.为依赖项创建全局软链npm link。一个符号链接&#xff0c;简称软链&a…...

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要&#xff1a;解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题&#xff0c;对若⼲证券⾏业的实际流量内容进⾏调研分析&#xff0c; 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁&#xff0c;并提出防…...

使用Swoole开发高性能的Web爬虫

使用swoole开发高性能的web爬虫 Web爬虫是一种自动化获取网络数据的工具&#xff0c;它可以在互联网上收集数据&#xff0c;并且可以被应用于各种不同的领域&#xff0c;如搜索引擎、数据分析、竞争对手分析等。随着互联网规模和数据量的快速增长&#xff0c;如何开发一个高性…...

【Elasticsearch】Elasticsearch索引创建与管理详解

文章目录 &#x1f4d1;引言一、Elasticsearch 索引的基础概念二、创建索引2.1 使用默认设置创建索引2.2 自定义设置创建索引2.3 创建索引并设置映射 三、索引模板3.1 创建索引模板3.2 使用索引模板创建索引 四、管理索引4.1 查看索引4.2 更新索引设置4.3 删除索引 五、索引别名…...

[数据集][目标检测]棉花检测数据集VOC+YOLO格式389张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;389 标注数量(xml文件个数)&#xff1a;389 标注数量(txt文件个数)&#xff1a;389 标注类别…...

使用Java实现实时数据处理系统

使用Java实现实时数据处理系统 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 在当今信息爆炸的时代&#xff0c;实时数据处理系统变得越来越重要。无论…...

整合web-socket的常见bug

整合文章连接 此文是记录我上网查找整合方案时候踩的坑,特别是注册失败的问题,比如还有什么去掉Compoent就可以,但是这样这个端点就失效了 特别是报错: at org.springframework.web.socket.server.standard.ServerEndpointExporter.registerEndpoint(ServerEndpointExporter.…...

Python 中字符串的常用操作都有哪些?

在 Python 中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a ‘abc’ b “abc” c ‘’‘abc’’’ d “”“abc”"" print(type(a)) # <class ‘str’> print(type(b)) # <class ‘str’> print(type©) # <…...

FFmpeg 硬件编码加速文档介绍

介绍 硬件访问:许多平台提供了对专用硬件的访问,这些硬件可以用于执行解码、编码或过滤等视频相关操作。 性能与资源使用:使用硬件可以加快某些操作的速度或减少其他资源(特别是CPU)的使用,但可能会产生不同的结果或质量较低,或带来在使用纯软件时不存在的额外限制。 硬…...

【Matlab函数分析】imread从图形文件读取图像

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…...

零基础光速入门AI绘画,SD保姆攻略

前言 大家好&#xff0c;我是AI绘画咪酱。一名AIGC狂热爱好者&#xff0c;目前正在AI绘画领域进行深入的探索。 我花了一个月时间把SD研究了一遍&#xff0c;秉持着用有趣、易懂的文字让小白也可以零基础光速使用SD&#xff08;stable diffusion&#xff09;入门AI绘画&#…...

详细配置SQL Server的链接服务器(图文操作Mysql数据库)

目录 前言1. MySQL ODBC 驱动2. 配置 SQL Server 链接服务器3. 彩蛋前言 此处配置以及安装没有什么理论知识 所以直奔主题,跟着以下步骤配置安装即可 需求:准备在10.197.0.110中链接外部的10.197.0.96的mysql数据源 已默认在10.197.0.96中安装了MySQL数据库并且知道其连接信…...

DDD学习笔记五

模型引力场&#xff1a;聚合 强作用力体现&#xff1a; 某个领域模型是另一些模型存在的前提&#xff0c;没有前者&#xff0c;后者就失去了生存的意义。 一组领域模型之间存在关联的领域逻辑&#xff0c;任何时候都不能违反。 一组领域模型必须以一个完整的、一致的状态呈现给…...

CAN报文的发送类型-OnChange、OnWrite、IfActive、Repetition

CAN报文的发送类型分为基本发送类型和混合发送类型两大类 CAN基本发送类型包括Cyclic周期发送、OnChange变化时发送、OnWrite写入时发送和IfActive有效时发送。基本发送类型中的Cyclic称为周期型,而其他3个类型称为事件型(Event)。发送次数是通过定义Repetition重复次数来实…...

神经网络在机器学习中的应用:手写数字识别

机器学习是人工智能的一个分支&#xff0c;它使计算机能够从数据中学习并做出决策或预测。神经网络作为机器学习的核心算法之一&#xff0c;因其强大的非线性拟合能力而广泛应用于各种领域&#xff0c;包括图像识别、自然语言处理和游戏等。本文将介绍如何使用神经网络对MNIST数…...

QT拖放事件之四:自定义拖放操作-利用QDrag来拖动完成数据的传输-案例demo

1、核心代码 #include "Widget.h" #include "ui_Widget.h" #include "MyButton.h"Widget::Widget(QWidget *parent): QWidget...

Spring Boot应用的部署与扩展

Spring Boot应用的部署与扩展 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 引言 Spring Boot作为现代化Java应用的首选框架之一&#xff0c;以其简化的配置…...

Spring底层原理之bean的加载方式八 BeanDefinitionRegistryPostProcessor注解

BeanDefinitionRegistryPostProcessor注解 这种方式和第七种比较像 要实现两个方法 第一个方法是实现工厂 第二个方法叫后处理bean注册 package com.bigdata1421.bean;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.…...

大数据面试题之Spark(5)

Spark SQL与DataFrame的使用? Sparksql自定义函数?怎么创建DataFrame? HashPartitioner和RangePartitioner的实现 Spark的水塘抽样 DAGScheduler、TaskScheduler、SchedulerBackend实现原理 介绍下Sparkclient提交application后&#xff0c;接下来的流程? Spark的几种…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...