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 代码基于开源组件生成带头像的二维码,推荐收藏! 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&am....
Java 中一个你绝对没用过,但是很好用的数据结构 2022-11-23 Java 中常规的集合工具,相比大家都熟练于胸,但是如果说有一个集合类你不一定知道或者说肯定没用过,你相不相信呢?今天跟大家介绍的就是java.util.EnumMap,也是 java.util 包下面的一个集合类,同样的也有对应的的 java.util.EnumSet,下面我们看一下吧。 用过的小伙伴在评论扣 1,没用过扣个 0,让阿粉看看有多少小伙伴用过 Map 和 Set 结构在我们日常工作的使用的特别多,经常会用来存放数据或者参数传递,不过有些场景在使用 Map 的时候,不知道大家会不会感受到一丝丝的不安,毕竟 Map 的数据设置我们没办法控制,完全不知道别人会 put 一些什么样的数据进去,或者说如果某些场景我们 Map 的数据 Key 的类型和个数是固定,那在这种情况的下,我们如何提升系统的安全性和性能呢? 这个时候我们就可以考虑使用 EnumMap,EnumMap 顾名思义首先是一个 Map,其次它的key 只能是枚举,大家都知道枚举中的实例个数是固定的,而且还是预编译的,所以在很大程度上保证了数据的安全性,同时也可以提升一定的性能。 EnumMap 下面我们来看下如何使....
Google 翻译退出中国大陆,原因竟然是因为... 2022-11-23 不知道大家最近有没有发现,谷歌翻译突然用不了了,阿粉查询了一下,原因是谷歌翻译退出了中国大陆,然而退出中国大陆的原因你绝对想不到,竟然是因为使用率太低! 看到这个原因有很多网友表示震惊了,表示自己一直用谷歌翻译,每天都用,怎么就使用率太低了,不能访问的太突然了。现在打开谷歌翻译国内域名https://translate.google.cn/ 会显示下面的页面,变成一个普通的搜索框,点击过后会进入谷歌翻译香港地址。当然香港地址在国内也还是没有办法正常访问的。 早在 2010年,谷歌这家科技巨头就已经退出中国市场,仅保留谷歌翻译与谷歌地图两款服务。但是在2020年2月,谷歌地图在中国大陆停止服务,如今,最后一项服务也暂停在中国的服务。 对于程序员来说,使用的最多的翻译应该就是谷歌翻译,谷歌翻译的准确性相对于国内的一些翻译软件要好很多,这也是为什么大家会使用的原因,谷歌翻译是一项免费的服务,支持翻译的语言多达133种。 这款翻译工具使用传统计机器翻译,会在翻译的过程中在经过人工翻译的文档中进行大量检索与推测,从而得出最合适的翻译结果,因此受到很多用户的喜爱,特殊被程序员钟爱。 所以当阿粉发现....
成为程序员之后你明白了什么? 2022-11-23 如果问你成为程序员以来,你明白了哪些道理,你的回答会是什么呢? 知乎上面有个提问,问题是成为程序员后你都明白什么?获取的几十万的浏览量。 首赞的一个回答是引用了阮一峰老师的一个博文,是翻译美国最大的论坛 Reddit 之前的一个热帖,是一个喝醉了的十年工作经验的程序员写下来的,堪称是程序员的酒后真言。 职业发展的最好方法是换公司。 技术栈不重要。技术领域有大约 10-20 条核心原则,重要的是这些原则,技术栈只是落实它们的方法。你如果不熟悉某个技术栈,不需要过度担心。 工作和人际关系是两回事。有一些公司,我交到了好朋友,但是工作得并不开心;另一些公司,我没有与任何同事建立友谊,但是工作得很开心。 我总是对经理实话实说。怕什么?他开除我?我会在两周内找到一份新工作。 如果一家公司的工程师超过 100 人,它的期权可能在未来十年内变得很有价值。对于工程师人数很少的公司,期权一般都是毫无价值。 好的代码是初级工程师可以理解的代码。伟大的代码可以被第一年的 CS 专业的新生理解。 作为一名工程师,最被低估的技能是记录。说真的,如果有人可以教我怎么写文档,我会付钱,也许是 1000 美元。 网上....
一文教你如何通过 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........
后端程序员对于 Docker 要掌握多少才行?阿粉的答案是 2022-11-23 阿粉的答案是会部署服务就行了。 关于 Docker 阿粉相信作为后端程序员小伙伴们多多少少都听过或者用过,而且很多时候也都是因为要使用的时候才会去学习,毕竟学了用不上还不如不学。 对于后端程序员来说,如果不是专门运维或者喜欢研究运维的同学,对于 Docker 的使用只要能熟练的部署服务基本上就够用了。毕竟说实话作为后端程序员要学习的东西真的太多了,一名合格的后端程序员不仅要能看得懂改得了前端代码,也要能懂运维部署和数据库设计,而且每个领域还动不动就有很多新东西要学习,只能说太难了,毕竟每个人的精力是有限的。 为了掌握一下 Docker 再加上阿粉最近搞了一台轻量服务器,想折腾点东西,但是不知道搞什么好,所以就想起来了搭建一个网站来玩玩,可以用来写一些文章和分享啥的。 搭建网站有很多种方式,不过最强大的还是要数 WordPress,但是如果要完全靠自己搭建环境还是比较复杂,所以就想着还是使用 docker 来搭建,简单快速。 0. 安装 Docker 在 Linux 服务器中安装 docker 非常简单,直接执行yum install docker 命令即可,阿粉这边已经安装过了,所以就....
Java 中如何实现一个像 String 一样不可变的类? 2022-11-23 如果问你在日常开发中用到的最多的一个 Java 类是什么,阿粉敢打赌绝对是 String.class。说到 String 大家都知道 String 是一个不可变的类;虽然用的很多,那不知道小伙伴们有没有想过怎么样创建一个自己的不可变的类呢?这篇文章阿粉就带大家来实践一下,创建一个自己的不可变的类。 特性 在手动编写代码之前,我们先了解一下不可变类都有哪些特性, 定义类的时候需要使用 final 关键字进行修饰:之所以使用 final 进行修饰是因为这样可以避免被其他类继承,一旦有了子类继承就会破坏父类的不可变性机制; 成员变量需要使用 final 关键词修饰,并且需要是 private 的:避免属性被外部修改; 成员变量不可提供 setter 方法,只能提供 getter 方法:避免被外部修改,并且避免返回成员变量本身; 提供所有字段的构造函数; 实操 知道了不可变类的一些基本特性之后,我们来实际写代码操作一下,以及我们会验证一下,如果不按照上面的要求来编写的话,会出现什么样的问题。 这里我们定义一个 Teacher 类来测试一下,按照我们上面提到的几点,我们给类和属性的定义都加上 f....
我敢打赌你一定没用过 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....
远程调用失败?如何优雅的进行重试? 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....
重磅!俄罗斯将与全球互联网断开,启用本国互联网“Runet”! 2022-11-23 经历过宿舍断网,经历过公司断网,没想到 21 世纪我们还能经历国家断网! 最近网上有消息说是随着俄罗斯和乌克兰的冲突的加剧,继西方在金融方面针对俄罗斯进行制裁之后,又将在互联网方面进行制裁。 乌克兰互联网名称与数字地址分配机构代表、乌克兰副总理兼数字化转型部长米哈伊洛·费多罗夫又要求俄罗斯的顶级域名例如 .ru、.рф 和 .su 连同其关联的安全套接字层(SSL)证书一起被吊销。他还要求欧洲、中东和中亚部分地区的区域互联网注册机构 RIPE NCC 撤销俄罗斯及其本地互联网注册中心(LIR)使用其分配的 IPv4 和 IPv6 地址,并封锁其 DNS 根服务器。 通常情况下,面对这种威胁,如果没有任何的预防和应对措施,别说俄罗斯了阿粉觉得任何一个国家的互联网生态系统都会受到巨大打击,而且民用互联网更容易受到攻击,普通民众的银行证书和网站密码泄露的可能性会大大增加。 想象一下,让你一天不上网断开所有的网络,不能聊微信,不能打游戏,不能刷抖音,不能居家办公,不能看阿粉的文章推送是多么的难受! 不过俄罗斯作为一个大国,早在 2019 年的时候就想到了这种情况,当时普京签署了一项名叫《主权互....
Java 极客技术的第 800 篇原创,想跟你分享一下我们的成长历程 2022-11-23 Hello,大家好,这是我们公号「Java 极客技术」的第 800 篇原创,作为圈内分享技术的公众号我们的原创数量不说最多,但也绝对不少。这一路走来团队里面的每个小伙伴都在努力,大家基本上都是从 2019 年开始一路坚持下来的,这三年多的时间风雨无阻,砥砺前行。 公号的由来 早期的小伙伴应该都知道我们 【Java 极客技术】公众号是由【纯洁的微笑】微笑哥在 2019 年发起的一起搞事情创立起来的,早期的成员还包括【沉默王二】的二哥,【江南一点雨】的松哥,都是圈内有名的大佬。 一起搞事情活动是微笑哥发起的项目,简单来说在网上组织几个志同道合的人一起运营项目,运营项目的收益大家根据多劳多得的准则自行分成,就比如说我们的公众号【 Java 极客技术】是最早第一期搞事情的项目,现在以鸭血粉丝的形象在独立运营,带来的收益其实是有几个人一起分成的。 比如上面就是我们公众号去年某个月的分成数据,可以看到基本上每个月都可以有 1-2k 额外收入,当然并不是每个月都会是这样,根据行情以及公号的运营情况而定。另外搞事情这个活动不单单是运营公众号,还有很多其他活动比如说闲鱼,抖音,B 站,知乎等等,找到最适....
用了那么久的 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 中经常被提到的 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....
程序员如何打造一款适合自己的终端工具?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 中下载....
15 行 Java 代码实现一个标准输出的进度条,其中的知识点你知道但并不一定会用 2022-11-23 最近阿粉在折腾一台服务器,折腾的过程中往往会需要安装很多依赖软件,有的是在官网下载压缩包,有的是通过系统命令直接安装,在通过系统命令直接安装的时候,就会有类似下面的进度条出现。 进度条在我们日常使用的软件中已经很频繁了,不过除了安装软件一般都是在网页中看到,看到这个阿粉就想知道,那如何在标准输出中实现一个进度条呢? 光有想法是不行,接下来我们就开始实践一下,通过 Java 代码在标准输出中实现一个类似的进度条。 首先我们看到一个进度条是从 0 加载到 100 的一个过程,实现进度条我们需要一个最终的状态,然后逐渐从到有变化形成,所以我们要有一个百分比显示,其次我们要有两种不一样的样式变化。我们可以通过先展示一种符合为百分百,然后不断通过替换新的符合,产生一种变化的效果,这里我们采用下面这两种符号来表示 char incomplete = '░'; // U+2591 Unicode Character 表示还没有完成的部分 char complete = '█'; // U+2588 Unicode Character 表示已经完成的部分 通过用完成的符号不断的替换未完成的符号,形成.....
消息队列堆积太多,下游处理不过来怎么办? 2022-11-23 作为后端程序员日常工作中难免会遇到要跟消息队列打交道的时候,而且在当下微服务的场景下,很多服务的性能不是我们自己能控制的,这不阿粉最近就遇到了一个场景,由于上游服务流量增加,发送到消息队列的消息增多,阿粉在处理消息的时候需要依赖下游的一个服务,可是谁想到下游的服务效率太差,消息太多处理不过来,CPU 居高不下。 看过我们昨天文章的小伙伴应该都知道,这个时候我们就需要进行限流了,为了避免将下游的服务打垮,我们来进行单机限流操作。这里我们来模拟一下操作过程,首先我们通过一段伪代码来模拟大流量,然后通过配置 sentinel 的控制台来配置规则从而实现单机 QPS 20 的限制。 创建 SpringBoot 服务 首先我们创建一个 SpringBoot 服务,在 pom.xml 文件中增加下面的配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </depende....
分享几款我在高频使用的 Chrome 浏览器插件,每一个都好用到飞起 2022-11-23 世上浏览器千千万,唯 Chrome 独领风骚,Chrome 浏览器的另一个亮点就是它拥有强大的扩展插件,很多好用的功能都可以通过插件来使用,今天就给大家分享几个阿粉常用的 Chrome 浏览器插件,包含编程和阅读相关,如果你有更好用的浏览器插件,欢迎在评论区留言,让更多人使用起来。 编程相关 JSON-handle 不管是不是 Java 程序员,日常工作中必不可少的会接触到 JSON 的使用,当我们做前后端对接的使用,很多时候的入参和出参都是 JSON 格式的数据。json-handle 就是一款渲染 json 格式字符串的插件工具,它可以将一个字符串转化成美观的 json 格式,也可以将 json 格式压缩成一行字符串,使用起来非常方便和简单。 安装过后,点击浏览器搜索框右侧的图标就可以看到下面这个弹框,然后将已经有的 json 数据贴进去,点击 ok 即可。 弹框中还提供了一些快捷操作,比如可以通过 aline 按钮,将 json 格式转换成一行 {"l1":{"l1_1":["l1_1_1","l1_1_2"],"l1_2":{"l1_2_1":121}},"l2":{"l2_1....
研究生写脚本公开发布代抢九价疫苗被抓! 2022-11-23 有道是知识改变命运,有的人因为有了知识改变了自己的人生轨迹,走上人生巅峰,迎娶白富美;而有的人缺因为有了知识却走了违法犯罪的道路。 最近有新闻报道在江西南昌的一个研究生刘某,听说自己的女朋友一直抢不到 HPV 九价疫苗,就想着利用自己的技术,写了一个抢九价疫苗的脚本程序,而且非常顺利的帮到自己的女朋友抢到了九价疫苗。 原本以为故事发展到这里就结束了,女朋友顺利的打上了疫苗,一切都很美好,同时这个程序员刘某技术高超,成功的在女朋友面前秀了一把。 然而缺乏法律知识的两个人,大肆旗鼓的传播,还把这件事情公开到网络上,利用小红书,朋友圈等社交软件散布自己能代抢九价疫苗的消息,然后通过收取 800 到 1000 不等的费用来帮忙别人进行抢购。 原本刘某还想着自己第一次能帮女朋友抢到是因为运气好,没想着靠这个挣钱,但是由于需要代抢的人较多,而且每个还能收取高额的佣金,就没有抵挡住诱惑,开始干起来代抢疫苗的勾当。 可能是因为成功的次数的较多,所以就更加猖狂,多次在微信朋友圈,小红书等各大社交平台发布消息,说可以有偿代抢疫苗,预约九价疫苗 900 ,增加 100 还可以提供加急的服务。 这简直是把火车....
作为一名工作了7、8年的程序员,感觉啥都会,但是又啥都不精通,怎么办? 2022-11-23 最近在逛知乎的时候,遇到上面标题的这个问题,不知道大家看到这个问题是怎么想的,阿粉看到这个还是有点感触的,作为一个即将达到这个工作年限的人,阿粉也经常在思考类似的问题。 阿粉个人还是比较赞同排名第一的回答,这个回答主要从两个方面来分析 选择合适的赛道 技术人员也要有赛道的概念,这里的赛道指的是互联网领域的细分行业,比如说电商领域,社交领域,区块链领域,金融领域,广告领域等。 其实很多技术人员对这个概念并不认同或者说即使认同也不会这么做,都觉得技术人员只要搞好技术就行了,做金融也是写 Java 做电商也是写 Java,反正都是写代码,只要搞好自己的技术并不关心具体的业务。 但是往往忽略了技术是为了业务服务的。见过很多程序员在做需求或者业务的时候只考虑技术层面的东西,并不会主动去了解业务,很多时候这是种不成熟的表现,我们要明白所有的技术都是为了业务服务的,抛开业务场景讨论技术都是不成熟的,技术的发展和升级最终的结果都是业务价值的体现。任何业务需求如果没有产生价值,背后的技术再厉害,再牛逼也没有用,不会有人歌颂,不会有人记住。 而且每个行业因为行业本身的特点就决定了需要使用什么样的技术,比如....