Java 代码基于开源组件生成带头像的二维码,推荐收藏!

2022-11-23

二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下。 在动手之前我们先思考一下需要进行的操作,首先我们需要生成一个二维码,其次我们需要在这里二维码中间添加一个头像。 这里我们生成二维码使用工具 zxing,合成图片我们采用 thumbnailator,接下来我们实操一下吧。 生成二维码 首先我们先根据目标地址,生成一个二维码,这里我们使用的是组件 zxing,在 SpringBoot 的pom依赖中,我们加入下面的依赖。 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.4.0</version> </dependency> <dependency> <groupId>com.google.zxing</groupId&gt....

SpringBoot 自动装配的原理分析

2022-11-23

关于 SpringBoot 的自动装配功能,相信是每一个 Java 程序员天天都会用到的一个功能,但是它究竟是如何实现的呢?今天阿粉来带大家看一下。 自动装配案例 首先我们通过一个案例来看一下自动装配的效果,创建一个 SpringBoot 的项目,在 pom 文件中加入下面的依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 其中 web 的依赖表示我们这是一个 web 项目,redis 的依赖就是....

Java 中九种 Map 的遍历方式,你一般用的是哪种呢?

2022-11-23

日常工作中 Map 绝对是我们 Java 程序员高频使用的一种数据结构,那 Map 都有哪些遍历方式呢?这篇文章阿粉就带大家看一下,看看你经常使用的是哪一种。 通过 entrySet 来遍历 1、通过 for 和 map.entrySet() 来遍历 第一种方式是采用 for 和 Map.Entry 的形式来遍历,通过遍历 map.entrySet() 获取每个 entry 的 key 和 value,代码如下。这种方式一般也是阿粉使用的比较多的一种方式,没有什么花里胡哨的用法,就是很朴素的获取 map 的 key 和 value。 public static void testMap1(Map<Integer, Integer> map) { long sum = 0; for (Map.Entry<Integer, Integer> entry : map.entrySet()) { sum += entry.getKey() + entry.getValue(); } System.out.println(sum); } 看过 HashMap 源码的同学....

关于 Java 的可变参数你真的了解吗?

2022-11-23

我们都知道 Java 支持可变参数的形式定义方法,这种语法糖在某些时候可以简化我们的代码,但是关于可变参数是如何实现的以及其他的更多细节,你真的知道吗?今天阿粉就带你来了解一下。 ![image-20220212232737739](/Users/silence/Library/Application Support/typora-user-images/image-20220212232737739.png)

微软宣布正式关闭 IE浏览器,历时 28 年的 IE 浏览器走向了终点

2022-11-23

提到 IE 浏览器大家能想到是什么呢?慢,慢,还是慢!近日有消息称微软将在 2022 年 6月 15 日正式关闭 IE 浏览器,届时更新了最新 Windows 系统的用户将无法在新系统上启用 IE 浏览器,只能说该来的总会来。 说真的阿粉从接触电脑以来除了在学校机房里面用 IE 浏览器之外,其他时候用的最多的就是通过 IE 浏览器下载 Chrome 浏览器,而它的价值也就停留在这里了,下载了 Chrome 浏览器以后,IE 再也没有被打开过,桌面上的快捷方式也被删掉了。 今天 IE 也终于迎来了它的末日,虽然 IE 比不了当下的 Chrome,Firefox 等浏览器,但是毕竟也是曾经的一哥,靠着强大的微软爸爸的系统强绑定,一度市场份额占据第一,而且很多政府单位的官网或者系统都还只支持 IE 访问。 之前微软就对 IE 浏览器停止了更新,现在是真正的准备放弃了,毕竟 IE 的名声已经就不回来了,索性推出 Edge,用一个新的产品来替代旧的。 熟悉的朋友可能知道,其实最开始的浏览器并不是 IE ,而是网景公司开发的 Netscape 浏览器,Netscape 浏览器定义了许多关于浏览器的....

远程调用失败?如何优雅的进行重试?

2022-11-23

在日常开发的过程中我们经常会需要调用第三方组件或者数据库,有的时候可能会因为网络抖动或者下游服务抖动,导致我们某次查询失败,这种时候我们往往就会进行重试,当重试几次后依旧还是失败的话才会向上抛出异常进行失败。接下来阿粉就给大家演示一下通常是如何做的,以及如何更优雅的进行重试。 常规做法 我们先来看一下常规做法,常规做法首先会设置一个重试次数,然后通过 while 循环的方式进行遍历,当循环次数没有达到重试次数的时候,直到有正确结果后就返回,如果重试依旧失败则会进行睡眠一段时间,再次重试,直到正常返回或者达到重试次数返回。 package com.example.demo.service; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import java.util.Random; import java.util.concu....

我敢打赌你一定没用过 Java 中的这个类!

2022-11-23

在 Java 中有这样的一个类,平时可能都用不到,但是需要的时候还是会很方便的,它就是 Java 中的javafx.util.Pair。在介绍 Pair 的使用之前我们先看看下面的例子。 如果对 Python 或者 GO 这两个语言有了解的,应该知道这两种语言是有下面这样的特性,那就是一个函数可以返回多个值,如下所示: Python 示例: #! /usr/bin/env python3 # -- coding: utf-8 -- """ 日期:2022-07-09 12:14 描述:a test module """ author = 'ziyou' def mul_result(a, b): key = "key" value = a + b return key, value if name == 'main': key, mul = mul_result(3, 4) print(key) print(mul) GO 示例: package main import "fmt" func mul_result(a, b int) (key string....

Java 中如何实现一个像 String 一样不可变的类?

2022-11-23

如果问你在日常开发中用到的最多的一个 Java 类是什么,阿粉敢打赌绝对是 String.class。说到 String 大家都知道 String 是一个不可变的类;虽然用的很多,那不知道小伙伴们有没有想过怎么样创建一个自己的不可变的类呢?这篇文章阿粉就带大家来实践一下,创建一个自己的不可变的类。 特性 在手动编写代码之前,我们先了解一下不可变类都有哪些特性, 定义类的时候需要使用 final 关键字进行修饰:之所以使用 final 进行修饰是因为这样可以避免被其他类继承,一旦有了子类继承就会破坏父类的不可变性机制; 成员变量需要使用 final 关键词修饰,并且需要是 private 的:避免属性被外部修改; 成员变量不可提供 setter 方法,只能提供 getter 方法:避免被外部修改,并且避免返回成员变量本身; 提供所有字段的构造函数; 实操 知道了不可变类的一些基本特性之后,我们来实际写代码操作一下,以及我们会验证一下,如果不按照上面的要求来编写的话,会出现什么样的问题。 这里我们定义一个 Teacher 类来测试一下,按照我们上面提到的几点,我们给类和属性的定义都加上 f....

后端程序员对于 Docker 要掌握多少才行?阿粉的答案是

2022-11-23

阿粉的答案是会部署服务就行了。 关于 Docker 阿粉相信作为后端程序员小伙伴们多多少少都听过或者用过,而且很多时候也都是因为要使用的时候才会去学习,毕竟学了用不上还不如不学。 对于后端程序员来说,如果不是专门运维或者喜欢研究运维的同学,对于 Docker 的使用只要能熟练的部署服务基本上就够用了。毕竟说实话作为后端程序员要学习的东西真的太多了,一名合格的后端程序员不仅要能看得懂改得了前端代码,也要能懂运维部署和数据库设计,而且每个领域还动不动就有很多新东西要学习,只能说太难了,毕竟每个人的精力是有限的。 为了掌握一下 Docker 再加上阿粉最近搞了一台轻量服务器,想折腾点东西,但是不知道搞什么好,所以就想起来了搭建一个网站来玩玩,可以用来写一些文章和分享啥的。 搭建网站有很多种方式,不过最强大的还是要数 WordPress,但是如果要完全靠自己搭建环境还是比较复杂,所以就想着还是使用 docker 来搭建,简单快速。 0. 安装 Docker 在 Linux 服务器中安装 docker 非常简单,直接执行yum install docker 命令即可,阿粉这边已经安装过了,所以就....

一文教你如何通过 Stream API 批量 Mock 数据

2022-11-23

在日常开发的过程中我们经常会遇到需要 mock 一些数据的场景,比如说 mock 一些接口的返回或者说 mock 一些测试消息用于队列生产者发送消息,可能很多时候我们都是使用一些固定的 case 或者一条相同的数据重复使用。今天阿粉就教大家用 Stream 去构造一些伪真实的一些数据。 Mock 任意个 UUID 首先我们通过普通写法来构造 100 个 UUID,代码如下相信大家都会写,就不多说了。 public static List<UUID> listUUID(int size) { List<UUID> list = new ArrayList<>(); for (int i = 0; i < size; i++) { UUID uuid = UUID.randomUUID(); list.add(uuid); } return list; } 下面再提供 Stream 的写法,代码如下,一行搞定 public static List<UUID> listUUID2(int size) { return Stream.....

成为程序员之后你明白了什么?

2022-11-23

如果问你成为程序员以来,你明白了哪些道理,你的回答会是什么呢? 知乎上面有个提问,问题是成为程序员后你都明白什么?获取的几十万的浏览量。 首赞的一个回答是引用了阮一峰老师的一个博文,是翻译美国最大的论坛 Reddit 之前的一个热帖,是一个喝醉了的十年工作经验的程序员写下来的,堪称是程序员的酒后真言。 职业发展的最好方法是换公司。 技术栈不重要。技术领域有大约 10-20 条核心原则,重要的是这些原则,技术栈只是落实它们的方法。你如果不熟悉某个技术栈,不需要过度担心。 工作和人际关系是两回事。有一些公司,我交到了好朋友,但是工作得并不开心;另一些公司,我没有与任何同事建立友谊,但是工作得很开心。 我总是对经理实话实说。怕什么?他开除我?我会在两周内找到一份新工作。 如果一家公司的工程师超过 100 人,它的期权可能在未来十年内变得很有价值。对于工程师人数很少的公司,期权一般都是毫无价值。 好的代码是初级工程师可以理解的代码。伟大的代码可以被第一年的 CS 专业的新生理解。 作为一名工程师,最被低估的技能是记录。说真的,如果有人可以教我怎么写文档,我会付钱,也许是 1000 美元。 网上....

Google 翻译退出中国大陆,原因竟然是因为...

2022-11-23

不知道大家最近有没有发现,谷歌翻译突然用不了了,阿粉查询了一下,原因是谷歌翻译退出了中国大陆,然而退出中国大陆的原因你绝对想不到,竟然是因为使用率太低! 看到这个原因有很多网友表示震惊了,表示自己一直用谷歌翻译,每天都用,怎么就使用率太低了,不能访问的太突然了。现在打开谷歌翻译国内域名https://translate.google.cn/ 会显示下面的页面,变成一个普通的搜索框,点击过后会进入谷歌翻译香港地址。当然香港地址在国内也还是没有办法正常访问的。 早在 2010年,谷歌这家科技巨头就已经退出中国市场,仅保留谷歌翻译与谷歌地图两款服务。但是在2020年2月,谷歌地图在中国大陆停止服务,如今,最后一项服务也暂停在中国的服务。 对于程序员来说,使用的最多的翻译应该就是谷歌翻译,谷歌翻译的准确性相对于国内的一些翻译软件要好很多,这也是为什么大家会使用的原因,谷歌翻译是一项免费的服务,支持翻译的语言多达133种。 这款翻译工具使用传统计机器翻译,会在翻译的过程中在经过人工翻译的文档中进行大量检索与推测,从而得出最合适的翻译结果,因此受到很多用户的喜爱,特殊被程序员钟爱。 所以当阿粉发现....

消息队列堆积太多,下游处理不过来怎么办?

2022-11-23

作为后端程序员日常工作中难免会遇到要跟消息队列打交道的时候,而且在当下微服务的场景下,很多服务的性能不是我们自己能控制的,这不阿粉最近就遇到了一个场景,由于上游服务流量增加,发送到消息队列的消息增多,阿粉在处理消息的时候需要依赖下游的一个服务,可是谁想到下游的服务效率太差,消息太多处理不过来,CPU 居高不下。 看过我们昨天文章的小伙伴应该都知道,这个时候我们就需要进行限流了,为了避免将下游的服务打垮,我们来进行单机限流操作。这里我们来模拟一下操作过程,首先我们通过一段伪代码来模拟大流量,然后通过配置 sentinel 的控制台来配置规则从而实现单机 QPS 20 的限制。 创建 SpringBoot 服务 首先我们创建一个 SpringBoot 服务,在 pom.xml 文件中增加下面的配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </depende....

15 行 Java 代码实现一个标准输出的进度条,其中的知识点你知道但并不一定会用

2022-11-23

最近阿粉在折腾一台服务器,折腾的过程中往往会需要安装很多依赖软件,有的是在官网下载压缩包,有的是通过系统命令直接安装,在通过系统命令直接安装的时候,就会有类似下面的进度条出现。 进度条在我们日常使用的软件中已经很频繁了,不过除了安装软件一般都是在网页中看到,看到这个阿粉就想知道,那如何在标准输出中实现一个进度条呢? 光有想法是不行,接下来我们就开始实践一下,通过 Java 代码在标准输出中实现一个类似的进度条。 首先我们看到一个进度条是从 0 加载到 100 的一个过程,实现进度条我们需要一个最终的状态,然后逐渐从到有变化形成,所以我们要有一个百分比显示,其次我们要有两种不一样的样式变化。我们可以通过先展示一种符合为百分百,然后不断通过替换新的符合,产生一种变化的效果,这里我们采用下面这两种符号来表示 char incomplete = '░'; // U+2591 Unicode Character 表示还没有完成的部分 char complete = '█'; // U+2588 Unicode Character 表示已经完成的部分 通过用完成的符号不断的替换未完成的符号,形成....

程序员如何打造一款适合自己的终端工具?Oh My Zsh YYDS!

2022-11-23

作为后端程序员日常工作中使用最多的工具除了 IDEA 之外,那一定是 Linux 终端工具了,页面上终端工具有很多,比如 SecureCRT,Putty,Xshell 或者 macOS 自带的终端工具或者 iTerm 等等,其中有收费的也有免费,大家可以根据自己的喜好选择合适的一款就好,但是不管选择哪个工具,最终都是用来链接 Linux 系统的,如果想要用的顺手,我们还必须对其进行设置。 阿粉使用的终端是 macOS 系统的 iTerm,接下来就跟 iTerm 给大家演示如何设置终端,默认的终端是下面这样,不得不说,太难看了. 首先我们进行 zsh 的安装,通过命令yum install zsh 安装 zsh,如果是直接使用 macOS 可以使用命令brew install zsh 进行安装。 安装 zsh 完成过后,我们还需要给 zsh 做一个增强,接下来我们需要使用命令chsh -s $(which zsh) 切换 shell 类型,如下,不用关心下面的警告,必现没有报错。 接下来是最重要的部分,我们需要安装 Oh My Zsh 了,通过执行下面的这个命令,从 github 中下载....

Java 中经常被提到的 SPI 到底是什么?

2022-11-23

Java 程序员在日常工作中经常会听到 SPI,而且很多框架都使用了 SPI 的技术,那么问题来了,到底什么是 SPI 呢?今天阿粉就带大家好好了解一下 SPI。 SPI 概念 SPI 全称是 Service Provider Interface,是一种 JDK 内置的动态加载实现扩展点的机制,通过 SPI 技术我们可以动态获取接口的实现类,不用自己来创建。 这里提到了接口和实现类,那么 SPI 技术上具体有哪些技术细节呢? 接口:需要有一个功能接口; 实现类:接口只是规范,具体的执行需要有实现类才行,所以不可缺少的需要有实现类; 配置文件:要实现 SPI 机制,必须有一个与接口同名的文件存放于类路径下面的 META-INF/services 文件夹中,并且文件中的每一行的内容都是一个实现类的全路径; 类加载器 ServiceLoader:JDK 内置的一个类加载器,用于加载配置文件中的实现类; 举个栗子 上面说了 SPI 的几个概念,接下来阿粉就通过一个栗子来带大家感受一下具体的用法。 第一步 创建一个接口,这里我们创建一个解压缩的接口,其中定义了压缩和解压的两个方法。 packag....

用了那么久的 Java For 循环,你知道哪种方式效率最高吗?

2022-11-23

作为程序员每天除了写很多 if else 之外,写的最多的也包含 for 循环了,都知道我们 Java 中常用的 for 循环有两种方式,一种是使用 for loop,另一种是使用 foreach,那如果问你,这两种方式哪一种效率最高,你的回答是什么呢?今天阿粉就来带你看一下。 首先我们先通过代码来实际测试一下,在计算耗时之前我们先创建一个大小集合,然后通过不断的获取集合中的内容来测试耗时。 package com.example.demo; import java.util.ArrayList; import java.util.List; /** * <br> * <b>Function:</b><br> * <b>Author:</b>@author ziyou<br> * <b>Date:</b>2022-06-26 12:22<br> * <b>Desc:</b>无<br> */ public class ForTest ....

Java 极客技术的第 800 篇原创,想跟你分享一下我们的成长历程

2022-11-23

Hello,大家好,这是我们公号「Java 极客技术」的第 800 篇原创,作为圈内分享技术的公众号我们的原创数量不说最多,但也绝对不少。这一路走来团队里面的每个小伙伴都在努力,大家基本上都是从 2019 年开始一路坚持下来的,这三年多的时间风雨无阻,砥砺前行。 公号的由来 早期的小伙伴应该都知道我们 【Java 极客技术】公众号是由【纯洁的微笑】微笑哥在 2019 年发起的一起搞事情创立起来的,早期的成员还包括【沉默王二】的二哥,【江南一点雨】的松哥,都是圈内有名的大佬。 一起搞事情活动是微笑哥发起的项目,简单来说在网上组织几个志同道合的人一起运营项目,运营项目的收益大家根据多劳多得的准则自行分成,就比如说我们的公众号【 Java 极客技术】是最早第一期搞事情的项目,现在以鸭血粉丝的形象在独立运营,带来的收益其实是有几个人一起分成的。 比如上面就是我们公众号去年某个月的分成数据,可以看到基本上每个月都可以有 1-2k 额外收入,当然并不是每个月都会是这样,根据行情以及公号的运营情况而定。另外搞事情这个活动不单单是运营公众号,还有很多其他活动比如说闲鱼,抖音,B 站,知乎等等,找到最适....

重磅!俄罗斯将与全球互联网断开,启用本国互联网“Runet”!

2022-11-23

经历过宿舍断网,经历过公司断网,没想到 21 世纪我们还能经历国家断网! 最近网上有消息说是随着俄罗斯和乌克兰的冲突的加剧,继西方在金融方面针对俄罗斯进行制裁之后,又将在互联网方面进行制裁。 乌克兰互联网名称与数字地址分配机构代表、乌克兰副总理兼数字化转型部长米哈伊洛·费多罗夫又要求俄罗斯的顶级域名例如 .ru、.рф 和 .su 连同其关联的安全套接字层(SSL)证书一起被吊销。他还要求欧洲、中东和中亚部分地区的区域互联网注册机构 RIPE NCC 撤销俄罗斯及其本地互联网注册中心(LIR)使用其分配的 IPv4 和 IPv6 地址,并封锁其 DNS 根服务器。 通常情况下,面对这种威胁,如果没有任何的预防和应对措施,别说俄罗斯了阿粉觉得任何一个国家的互联网生态系统都会受到巨大打击,而且民用互联网更容易受到攻击,普通民众的银行证书和网站密码泄露的可能性会大大增加。 想象一下,让你一天不上网断开所有的网络,不能聊微信,不能打游戏,不能刷抖音,不能居家办公,不能看阿粉的文章推送是多么的难受! 不过俄罗斯作为一个大国,早在 2019 年的时候就想到了这种情况,当时普京签署了一项名叫《主权互....

分享几个阿粉常用的 IDEA 插件,每一个都能提高工作效率

2022-11-23

作为一个程序员,虽然阿粉不承认自己每天都在搬砖,但是事实告诉阿粉自己就是在搬砖,那如何高效的搬砖就成了阿粉持续研究的课题,毕竟通过高效的搬砖过后,阿粉才能有时间好好摸鱼。今天阿粉就把自己工作中最常用的几个 IDEA 插件分享给大家,帮助大家提高工作效率(更好的搬砖)。 GenerateAllSetter Postfix Completion 相信大家在日常写代码的时候,经常会遇到 DTO,VO 等其他的 POJO 进行互换的场景,字段的类型和名称都相同,就是需要完全的一个个进行赋值,这里一般会有两种写法,作为有经验的程序员相信大家都会使用 BeanUtils.copyProperties() 的实现,不管是采用哪个工具包下的 copy 方法,原理都是一样的,只是有的效率高点有的效率低的,但是不管怎么样还是很方便的; 但是对于一些有性能要求或者字段不多的实体来说,想最大的提升性能,那就只能一个个字段手动进行 set 和 get 了,这个插件的功能就是帮助大家在满足性能的前提下尽量的减少无效的工作量。 通过安装了这个插件过后,在遇到我们需要一个个手动进行 set 和 get 的场景的时候,....