# Java、SpringBoot 内置工具类

news/2024/2/28 18:12:57

Java、SpringBoot 内置工具类

文章目录

  • Java、SpringBoot 内置工具类
    • Java 工具类
      • Objects对象工具类
        • 比较
        • 校验空
      • Collections 集合工具类
        • 集合操作
        • 同步控制
      • Calendar日历类
      • Math数学类
    • SpringBoot 工具类
      • 断言
      • 对象、数组、集合
        • ObjectUtils
        • StringUtils
        • CollectionUtils
      • 文件、资源、IO 流
        • FileCopyUtils
        • ResourceUtils
        • StreamUtils
      • 反射、AOP
        • ReflectionUtils
        • AopUtils
        • AopContext

Java 工具类

Objects对象工具类

比较

// 两个参数相等,返回true,否则返回false
public static boolean equals(Object a, Object b)
// 若两个都是null值的字符串或者数组比较,返回true;该方法在数组比较中尤其有用,不清楚对象的具体类型时可以直接使用此方法来解决
public static boolean deepEquals(Object a, Object b) 
// 判断引用o所指对象是否为null,不为null,则返回o所指对象的hasCode方法执行结果,为null,返回0。
public static int hashCode(Object o)
// 若第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。
public static String toString(Object o, String nullDefault)

校验空

// 检查指定的对象引用是不是null 。若为null,则抛出空指针异常,否则返回对象本身
public static <T> T requireNonNull(T obj)
// 当被校验的参数为null时,根据第二个参数message抛出自定义的NullPointerException 
public static <T> T requireNonNull(T obj, String message)
// 判空方法,如果参数为null则返回true,否则返回false。
public static boolean isNull(Object obj)
// 判断非空方法,若参数是非空,返回true,否则返回false。
public static boolean nonNull(Object obj)

Collections 集合工具类

集合操作

// 反转
void reverse(List list)
// 随机排序
void shuffle(List list)
// 按自然排序的升序排序
void sort(List list)
// 定制排序,由Comparator控制排序逻辑
void sort(List list, Comparator c)
// 交换两个索引位置的元素
void swap(List list, int i , int j)
// 旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。
void rotate(List list, int distance)

同步控制

  • Collections提供了三类方法返回一个不可变集合

emptyXXX():返回一个空的只读集合,静态常量

singleXXX():返回一个只包含指定对象,只有一个元素,只读的集合。

unmodifiablleXXX():返回指定集合对象的只读视图。

Calendar日历类

@Test
public void test1() throws ParseException {// 创建一个日历对象,表示当前时间Calendar calendar = Calendar.getInstance();// 调用add(int field,int amount)方法添加年份calendar.add(Calendar.YEAR, 5);logger.info(String.valueOf(calendar));// 得到日历中的年份logger.info(String.valueOf(calendar.get(Calendar.YEAR)));// 得到一周中的第一天int first = calendar.getFirstDayOfWeek();// 得到当前日历对象对应的Date类型Date date = calendar.getTime();// 得到当前时间距1970年1月1日 00:00:00的毫秒数long timeInMillis = calendar.getTimeInMillis();// 将当前的日历对象的时间改为传入的时间calendar.set(Calendar.YEAR, 2029);calendar.set(2019, 8, 5, 16, 15, 30);// 获取今天是周几int weekDay = calendar.get(Calendar.DAY_OF_WEEK);logger.info("今天是周:{}", weekDay - 1);// 获取系统当前年int year = calendar.get(Calendar.YEAR);logger.info("今年是:{}年", year);// 获取系统当前月int month = calendar.get(Calendar.MONTH);logger.info("本月是:{}月", month + 1);// 获取系统当前日int day = calendar.get(Calendar.DATE);logger.info("今天是{}号", day);// 获取上午跟下午int am_pm = calendar.get(Calendar.AM_PM);if (am_pm == 0)logger.info("是上午");elselogger.info("是下午");// 获取当前的系统时间[date-->String]的过程Date time = calendar.getTime();// 获取的是当前系统的时间SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");String showTime = format.format(time);logger.info("当前系统时间为:{}", showTime);// 自定义日历的时间String strTime = "2021-07-07";date = new SimpleDateFormat("yyyy-MM-dd").parse(strTime);calendar.setTime(date);// 将时间对象data设置为新的日历logger.info("修改后的系统时间为:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(calendar.getTime()));logger.info("------------Calendar和Date转换------------");Date now = calendar.getTime();calendar.setTime(now);logger.info("------------Calendar日期计算以及判断------------");calendar = new GregorianCalendar();Calendar calendar2 = new GregorianCalendar();calendar2.set(Calendar.YEAR, 2800);// 是否在某个时间(calendar2)之后logger.info(String.valueOf(calendar.after(calendar2)));// 是否在某个时间(calendar2)之前logger.info(String.valueOf(calendar.before(calendar2)));// 增加多少年年,月日以及时分秒同理calendar.add(Calendar.YEAR, -10);
}

Math数学类

@Test
public void test1() {// 求绝对值Math.abs(-1);// 向上取整Math.ceil(3.1);// 向下取整Math.floor(3.9);// 求两个数的最大值Math.max(3, 9);// 求两个数的最小值Math.min(3, 9);// 求第一个数的第二个数次幂Math.pow(2, 3);// 求随机数 0-1Math.random();// 四舍五入Math.round(3.6);
}

SpringBoot 工具类

断言

  • 断言是一个逻辑判断,用于检查不应该发生的情况Assert 关键字在 JDK1.4 中引入,可通过 JVM 参数-enableassertions开启SpringBoot 中提供了 Assert 断言工具类,通常用于数据合法性检查
// 要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行
// 参数 message 参数用于定制异常信息。
void notNull(Object object, String message)
// 要求参数必须空(Null),否则抛出异常,不予『放行』。
// 和 notNull() 方法断言规则相反
void isNull(Object object, String message)
// 要求参数必须为真(True),否则抛出异常,不予『放行』。
void isTrue(boolean expression, String message)
// 要求参数(List/Set)必须非空(Not Empty),否则抛出异常,不予放行
void notEmpty(Collection collection, String message)
// 要求参数(String)必须有长度(即,Not Empty),否则抛出异常,不予放行
void hasLength(String text, String message)
// 要求参数(String)必须有内容(即,Not Blank),否则抛出异常,不予放行
void hasText(String text, String message)
// 要求参数是指定类型的实例,否则抛出异常,不予放行
void isInstanceOf(Class type, Object obj, String message)
// 要求参数 `subType` 必须是参数 superType 的子类或实现类,否则抛出异常,不予放行
void isAssignable(Class superType, Class subType, String message)

对象、数组、集合

ObjectUtils

  • 获取对象的基本信息
// 获取对象的类名。参数为 null 时,返回字符串:"null" 
String nullSafeClassName(Object obj)
// 参数为 null 时,返回 0
int nullSafeHashCode(Object object)
// 参数为 null 时,返回字符串:"null"
String nullSafeToString(boolean[] array)
// 获取对象 HashCode(十六进制形式字符串)。参数为 null 时,返回 0 
String getIdentityHexString(Object obj)
// 获取对象的类名和 HashCode。 参数为 null 时,返回字符串:"" 
String identityToString(Object obj)
// 相当于 toString()方法,但参数为 null 时,返回字符串:""
String getDisplayString(Object obj)
  • 判断工具
// 判断数组是否为空
boolean isEmpty(Object[] array)
// 判断参数对象是否是数组
boolean isArray(Object obj)
// 判断数组中是否包含指定元素
boolean containsElement(Object[] array, Object element)
// 相等,或同为 null时,返回 true
boolean nullSafeEquals(Object o1, Object o2)
/*
判断参数对象是否为空,判断标准为:Optional: Optional.empty()Array: length == 0
CharSequence: length == 0Collection: Collection.isEmpty()Map: Map.isEmpty()*/
boolean isEmpty(Object obj)
  • 其他工具方法
// 向参数数组的末尾追加新元素,并返回一个新数组
<A, O extends A> A[] addObjectToArray(A[] array, O obj)
// 原生基础类型数组 --> 包装类数组
Object[] toObjectArray(Object source)

StringUtils

  • 字符串判断工具
// 判断字符串是否为 null,或 ""。注意,包含空白符的字符串为非空
boolean isEmpty(Object str)
// 判断字符串是否是以指定内容结束。忽略大小写
boolean endsWithIgnoreCase(String str, String suffix)
// 判断字符串是否已指定内容开头。忽略大小写
boolean startsWithIgnoreCase(String str, String prefix) 
// 是否包含空白符
boolean containsWhitespace(String str)
// 判断字符串非空且长度不为 0,即,Not Empty
boolean hasLength(CharSequence str)
// 判断字符串是否包含实际内容,即非仅包含空白符,也就是 Not Blank
boolean hasText(CharSequence str)
// 判断字符串指定索引处是否包含一个子串。
boolean substringMatch(CharSequence str, int index, CharSequence substring)
// 计算一个字符串中指定子串的出现次数
int countOccurrencesOf(String str, String sub)
  • 字符串操作工具
// 查找并替换指定子串
String replace(String inString, String oldPattern, String newPattern)
// 去除尾部的特定字符
String trimTrailingCharacter(String str, char trailingCharacter) 
// 去除头部的特定字符
String trimLeadingCharacter(String str, char leadingCharacter)
// 去除头部的空白符
String trimLeadingWhitespace(String str)
// 去除头部的空白符
String trimTrailingWhitespace(String str)
// 去除头部和尾部的空白符
String trimWhitespace(String str)
// 删除开头、结尾和中间的空白符
String trimAllWhitespace(String str)
// 删除指定子串
String delete(String inString, String pattern)
// 删除指定字符(可以是多个)
String deleteAny(String inString, String charsToDelete)
// 对数组的每一项执行 trim() 方法
String[] trimArrayElements(String[] array)
// 将 URL 字符串进行解码
String uriDecode(String source, Charset charset)
  • 路径相关工具方法
// 解析路径字符串,优化其中的 “..” 
String cleanPath(String path)
// 解析路径字符串,解析出文件名部分
String getFilename(String path)
// 解析路径字符串,解析出文件后缀名
String getFilenameExtension(String path)
// 比较两个两个字符串,判断是否是同一个路径。会自动处理路径中的 “..” 
boolean pathEquals(String path1, String path2)
// 删除文件路径名中的后缀部分
String stripFilenameExtension(String path) 
// 以 “. 作为分隔符,获取其最后一部分
String unqualify(String qualifiedName)
// 以指定字符作为分隔符,获取其最后一部分
String unqualify(String qualifiedName, char separator)

CollectionUtils

  • 集合判断工具
// 判断 List/Set 是否为空
boolean isEmpty(Collection<?> collection)
// 判断 Map 是否为空
boolean isEmpty(Map<?,?> map)
// 判断 List/Set 中是否包含某个对象
boolean containsInstance(Collection<?> collection, Object element)
// 以迭代器的方式,判断 List/Set 中是否包含某个对象
boolean contains(Iterator<?> iterator, Object element)
// 判断 List/Set 是否包含某些对象中的任意一个
boolean containsAny(Collection<?> source, Collection<?> candidates)
// 判断 List/Set 中的每个元素是否唯一。即 List/Set 中不存在重复元素
boolean hasUniqueObject(Collection<?> collection)
  • 集合操作工具
// 将 Array 中的元素都添加到 List/Set 中
<E> void mergeArrayIntoCollection(Object array, Collection<E> collection)  
// 将 Properties 中的键值对都添加到 Map 中
<K,V> void mergePropertiesIntoMap(Properties props, Map<K,V> map)
// 返回 List 中最后一个元素
<T> T lastElement(List<T> list)  
// 返回 Set 中最后一个元素
<T> T lastElement(Set<T> set) 
// 返回参数 candidates 中第一个存在于参数 source 中的元素
<E> E findFirstMatch(Collection<?> source, Collection<E> candidates)
// 返回 List/Set 中指定类型的元素。
<T> T findValueOfType(Collection<?> collection, Class<T> type)
// 返回 List/Set 中指定类型的元素。如果第一种类型未找到,则查找第二种类型,以此类推
Object findValueOfType(Collection<?> collection, Class<?>[] types)
// 返回 List/Set 中元素的类型
Class<?> findCommonElementType(Collection<?> collection)

文件、资源、IO 流

FileCopyUtils

  • 输入
// 从文件中读入到字节数组中
byte[] copyToByteArray(File in)
// 从输入流中读入到字节数组中
byte[] copyToByteArray(InputStream in)
// 从输入流中读入到字符串中
String copyToString(Reader in)
  • 输出
// 从字节数组到文件
void copy(byte[] in, File out)
// 从文件到文件
int copy(File in, File out)
// 从字节数组到输出流
void copy(byte[] in, OutputStream out) 
// 从输入流到输出流
int copy(InputStream in, OutputStream out) 
// 从输入流到输出流
int copy(Reader in, Writer out)
// 从字符串到输出流
void copy(String in, Writer out)

ResourceUtils

  • 从资源路径获取文件
// 判断字符串是否是一个合法的 URL 字符串。
static boolean isUrl(String resourceLocation)
// 获取 URL
static URL getURL(String resourceLocation) 
// 获取文件(在 JAR 包内无法正常使用,需要是一个独立的文件)
static File getFile(String resourceLocation)
  • Resource
// 文件系统资源 D:\...
FileSystemResource
// URL 资源,如 file://... http://...
UrlResource
// 类路径下的资源,classpth:...
ClassPathResource
// Web 容器上下文中的资源(jar 包、war 包)
ServletContextResource
// 判断资源是否存在
boolean exists()
// 从资源中获得 File 对象
File getFile()
// 从资源中获得 URI 对象
URI getURI()
// 从资源中获得 URI 对象
URL getURL()
// 获得资源的 InputStream
InputStream getInputStream()
// 获得资源的描述信息
String getDescription()

StreamUtils

  • 输入
void copy(byte[] in, OutputStream out)
int copy(InputStream in, OutputStream out)
void copy(String in, Charset charset, OutputStream out)
long copyRange(InputStream in, OutputStream out, long start, long end)
  • 输出
byte[] copyToByteArray(InputStream in)
String copyToString(InputStream in, Charset charset)
// 舍弃输入流中的内容
int drain(InputStream in) 

反射、AOP

ReflectionUtils

  • 获取方法
// 在类中查找指定方法
Method findMethod(Class<?> clazz, String name) 
// 同上,额外提供方法参数类型作查找条件
Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes) 
// 获得类中所有方法,包括继承而来的
Method[] getAllDeclaredMethods(Class<?> leafClass) 
// 在类中查找指定构造方法
Constructor<T> accessibleConstructor(Class<T> clazz, Class<?>... parameterTypes) 
// 是否是 equals() 方法
boolean isEqualsMethod(Method method) 
// 是否是 hashCode() 方法 
boolean isHashCodeMethod(Method method) 
// 是否是 toString() 方法
boolean isToStringMethod(Method method) 
// 是否是从 Object 类继承而来的方法
boolean isObjectMethod(Method method) 
// 检查一个方法是否声明抛出指定异常
boolean declaresException(Method method, Class<?> exceptionType) 
  • 执行方法
// 执行方法
Object invokeMethod(Method method, Object target)  
// 同上,提供方法参数
Object invokeMethod(Method method, Object target, Object... args) 
// 取消 Java 权限检查。以便后续执行该私有方法
void makeAccessible(Method method) 
// 取消 Java 权限检查。以便后续执行私有构造方法
void makeAccessible(Constructor<?> ctor) 
  • 获取字段
// 在类中查找指定属性
Field findField(Class<?> clazz, String name) 
// 同上,多提供了属性的类型
Field findField(Class<?> clazz, String name, Class<?> type) 
// 是否为一个 "public static final" 属性
boolean isPublicStaticFinal(Field field) 
  • 设置字段
// 获取 target 对象的 field 属性值
Object getField(Field field, Object target) 
// 设置 target 对象的 field 属性值,值为 value
void setField(Field field, Object target, Object value) 
// 同类对象属性对等赋值
void shallowCopyFieldState(Object src, Object dest)
// 取消 Java 的权限控制检查。以便后续读写该私有属性
void makeAccessible(Field field) 
// 对类的每个属性执行 callback
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) 
// 同上,多了个属性过滤功能。
void doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc, ReflectionUtils.FieldFilter ff) 
// 同上,但不包括继承而来的属性
void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) 

AopUtils

  • 判断代理类型
// 判断是不是 Spring 代理对象
boolean isAopProxy()
// 判断是不是 jdk 动态代理对象
isJdkDynamicProxy()
// 判断是不是 CGLIB 代理对象
boolean isCglibProxy()
  • 获取被代理对象的 class
// 获取被代理的目标 class
Class<?> getTargetClass()

AopContext

  • 获取当前对象的代理对象
Object currentProxy
doWithFields(Class<?> clazz, ReflectionUtils.FieldCallback fc, ReflectionUtils.FieldFilter ff) 
// 同上,但不包括继承而来的属性
void doWithLocalFields(Class<?> clazz, ReflectionUtils.FieldCallback fc) 

http://www.ppmy.cn/news/62708.html

相关文章

基于灰度的图像匹配

一、基于灰度的模板匹配 参考文章&#xff1a;https://blog.csdn.net/hujingshuang/article/details/47759579 【加*表示可适用于多模图像配准】 1.1 MAD算法 平均绝对差算法&#xff08;Mean Absolute Differences&#xff0c;简称MAD算法&#xff09;。它是Leese在1971年提…

前端架构师-week5-理解命令行交互原理和inquirer的应用

项目创建准备阶段——判断当前目录是否为空功能开发 // commands/init/lib/index.js 文件部分内容class InitCommand extends Command {......async exec() {try {// 1. 准备阶段this.prepare();// 2. 下载模板// 3. 安装模板} catch (e) {log.error(e.message);}}......async…

为什么要交叉编译?

一、什么是交叉编译、为什么要交叉编译 1、什么是交叉编译&#xff1f; 交叉编译&#xff1a;是在一个平台上生成另一个平台上的可执行代码。比如我们在 x86 平台上&#xff0c;编写程序并编译成能运行在 ARM 平台的程序&#xff0c;编译得到的程序在 x86 平台上是不能运行的…

Jackson 注解汇总:轻松处理 JSON 序列化与反序列化

Jackson 是 Java 中最流行的 JSON 处理库之一&#xff0c;它提供了许多注解来简化 JSON 的序列化和反序列化过程。这篇文章将介绍一些 Jackson 常用的注解&#xff0c;以帮助您更轻松地处理 JSON 数据。 1. JsonProperty JsonProperty 注解用于自定义 JSON 属性名称&#xff…

python连接oracle并自动发送邮件

文章目录 1 导入所需模块2连接ORACLE3 抽取结果3.1 抽取员工形象3.2 抽取门店形象3.3 抽取明细汇总 4 合并结果5 删除3中的结果6 写入总表6.1 明细汇总总表6.2 大区排名总表6.3 扣款总表 7 自动发送邮件 1 导入所需模块 #用于连接oracle数据库 import cx_Oracle as cx #用操作…

NetSuite .id的用法

我们必须认清一个事实&#xff0c;NetSuite Saved Search是一个被封装化的SQL查询工具。在NetSuite的早期版本中&#xff0c;可以利用Formula字段做很多SQL语句上的灰色应用。但是慢慢的&#xff0c;灰色应用范围被压缩了。目前只剩下一个“.id”的应用了。 今朝我们就谈谈.id…

训练计划安排(练一休一训练分化+倒金字塔训练法)【了解即可,一般人容量不用练一休一,看抖音@孙悟饭桶】

目录 练一休一训练分化每次训练的组数12-15组 &#xff08;4-5个动作&#xff09;QA 倒金字塔训练法倒金字塔热身正式组常见误区&#xff1a; 训练补剂bcaa咖啡因肌酸蛋白粉 如何降低皮质醇水平如何提升睾酮水平文献出处睡眠8h摄入适量脂肪&#xff08;0.8g每公斤体重&#xff…

关于并发编程与线程安全的思考与实践 | 京东云技术团队

作者&#xff1a;京东健康 张娜 一、并发编程的意义与挑战 并发编程的意义是充分的利用处理器的每一个核&#xff0c;以达到最高的处理性能&#xff0c;可以让程序运行的更快。而处理器也为了提高计算速率&#xff0c;作出了一系列优化&#xff0c;比如&#xff1a; 1、硬件…

MySQL优化二索引使用

1、索引分类 类型解释全局索引(FULLTEXT)全局索引&#xff0c;目前只有 MyISAM 引擎支持全局索引&#xff0c;它的出现是为了解决针对文本的模糊查询效率较低的问题&#xff0c;并且只限于 CHAR、VARCHAR 和 TEXT 列哈希索引(HASH)哈希索引是 MySQL 中用到的唯一 key-value 键…

OJ练习第94题——编辑距离

编辑距离 力扣链接&#xff1a;72. 编辑距离 题目描述 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 示例 1&#xff1a; …

vscode 远程开发:免密登入设置

文章目录 1. vscode 安装2. vscode 插件安装&#xff08;1&#xff09; 中文界面设置&#xff08;2&#xff09; ssh远程插件安装 3. 免密登入 1. vscode 安装 vscode 官网下载地址&#xff1a;https://code.visualstudio.com/ 安装很简单&#xff1a; 可以默认方式&#xff0…

gtest之高级主题

目录 Value-Parameterized测试示例Value-Parameterized实现 类型测试Type-Parameterized Tests注册test程序获取当前测试程序名运行测试程序选项选择性测试重复测试无序执行分发到不同的机器控制输出Controlling How Failures Are Reported结合Sanitizer Value-Parameterized测…

【SWAT水文模型】SWAT水文模型建立及应用第四期: 气象数据的准备(中国区域高精度同化气象站CMADS)

SWAT水文模型建立及应用&#xff1a; 气象数据的准备 1 简介2 气象数据的准备&#xff08;中国区域高精度同化气象站CMADS&#xff09;2.1 数据说明2.2 数据下载 3 CMADS 数据集SWAT子集使用说明3.1 SWAT2009版本3.2 SWAT2012版本 参考 本博客主要介绍气象数据的准备&#xff0…

软件测试简历项目经验怎么写?一篇足矣解决

一、前言&#xff1a;浅谈面试 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试&#xff0c;得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一…

IPWorks Bluetooth ! IPWorks BLE 2022 C++ Edition Crack

蓝牙库-IPWorks Bluetooth ! IPWorks BLE 2022 C Edition 一个蓝牙低功耗组件库&#xff0c;提供对 BLE 操作的直接访问。IPWorks BLE 组件提供简单的服务发现和对支持 BLE 的设备的访问。 最新的 IPWorks BLE 现已推出&#xff01;最新版本的 IPWorks BLE 具有现代化和简化的…

冲浪杂记——

华为od是指什么&#xff1f; 华为OD&#xff08;Open Developer Platform&#xff09;是华为面向全球开发者推出的开放平台&#xff0c;旨在为开发者提供丰富的技术资源和开发工具&#xff0c;支持开发者快速构建基于华为技术的应用程序、解决方案和服务。华为OD平台为开发者提…

系统安全分析与设计

目录 第五章、系统安全分析与设计1、信息系统安全属性2、对称加密技术与非对称加密技术3、信息摘要4、数字签名5、数字信封与PGP6、网络安全6.1、各个网络层次的安全保障6.2、网络威胁与攻击6.3、防火墙 第五章、系统安全分析与设计 1、信息系统安全属性 安全属性 保密性&…

做到“有效沟通”,帮你达到这3个目的

在项目管理中&#xff0c;团队沟通是至关重要的。团队成员之间应该建立良好的沟通机制&#xff0c;及时沟通和协调问题&#xff0c;避免出现问题后甩锅的情况。 在实际项目中&#xff0c;很多问题出现的原因是团队沟通不畅&#xff0c;项目经理需要加强团队沟通的重要性&…

Spring Boot项目创建和使用

一、Spring Boot简介 1.概念 Spring Boot 就是 Spring 框架的脚⼿架&#xff0c;它就是为了快速开发 Spring 框架⽽诞⽣的。 2.优点 有快速集成框架&#xff0c;可以快速添加外部jar包内置web框架&#xff0c;可以直接运行可以快速部署&#xff0c;不依赖任何外部的web容器…

科普文:国内ChatGPT怎么用,ChatGPT国内怎么用,关于ChatGPT你需要了解的内容应该都在这

在国内用了很长一段时间的ChatGPT&#xff0c;每次跟小白&#xff0c;哪怕是用ChatGPT的人交流的时候&#xff0c;都感觉解释不清&#xff0c;正好今天周末&#xff0c;给大家整理一篇关于ChatGPT的科普文&#xff0c;想要了解或使用ChatGPT的人&#xff0c;一定要看~~~&#x…
最新文章