Java
文章平均质量分 82
sp42a
What the web can be
展开
-
Java 线程与多线程(二)
有了线程然后才有多线程。多线程是对线程的升华。原创 2018-02-06 10:17:26 · 1018 阅读 · 2 评论 -
Java 多线程编程笔记
问题:多个线程同时访问或者操作一个资源,怎么保证这个资源数据的一致性。这个资源是抽象的,可以是数据框里面的一条记录,或者内存中一个共享变量。单核系统的并行操作是一个伪并行,但是多核 CPU 的并行有可能是真并行,CPU可以多核,内存可不是多核啊,那么这个时候真正并行的内存访问同一份数据就会有问题。原创 2023-01-08 10:03:26 · 463 阅读 · 0 评论 -
轻量级 S3 协议存储客户端
目前大家一般不会把二进制文件直接放在应用服务器上,而是存在“对象存储”的方案中,例如亚马逊的 AWS,阿里云的 OSS、Cloudflare R2 等。AWS 是最早的始作俑者,因此其 S3 协议也近乎标准化,各大厂商的对象存储方案都实现该协议。基本上各家都有提供方便的 SDK 可以用快速调用 S3 服务,不过其中的原理并不是太复杂,笔者一时“手痒”就想打造自己的 S3 客户端。原创 2024-04-13 17:38:24 · 2270 阅读 · 0 评论 -
轻量级角色权限组件
本文采用“用户+角色+权限”的模式设计一个简明的权限组件,力求清晰易维护、易扩展。该组件基于 Spring 后端与 Vue 前端的框架,并给出实际可运行的代码。虽然设计这组件的时候,是打算独立、不耦合的组件,但完整的功能外延还是涉及外部模块,于是最终成品来说,它的相关依赖也离不开 AJ-IAM,属于笔者 AJ-IAM 用户系统的一部分。尽管如此,更重要的是,笔者想借此文来分享“角色-权限”的设计思维与实际应用,以飨读者。原创 2024-02-20 15:33:14 · 998 阅读 · 0 评论 -
嵌入式 Tomcat 调校
SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow,——这是怎么做到的?我们以 Tomcat 为例子,尝试调用嵌入式 Tomcat。调用嵌入式 Tomcat,如果按照默认去启动,一个 main 函数就可以了。原创 2023-10-25 22:35:54 · 1109 阅读 · 0 评论 -
简明 JDBC 数据访问操作库:JdbcHelper(一)
综观后台开发,大多数的开发工作就是数据库的开发。怎么跟数据库打好交道与我们的开发体验息息相关。业界典型的讨论“对象关系阻抗不匹配”正是问题的症结所在:既然都是两种不同的“编程世界观”——一个数据库、一个编程语言,各自有各自的方法论、甚至思维都不太一样,怎么可以做到“和衷共济”呢?所以问题的关键就是如何解决这个“阻抗不匹配”难题,数据库模型和编程语言模型之间的差异所导致的“难题”。原创 2023-05-01 09:58:07 · 806 阅读 · 0 评论 -
实用工具:FastDoc 文档提取工具
简单、实用的 HTTP API 文档生成工具,支持 Spring MVC/Spring Boot 下的控制器信息提取,类似 Swagger 但稍有不同的机制。在线演示地址在。关于研发者这工具的动机,请参考我博客。文档的信息来自哪里?换句话说,根据哪些的信息,才能形成文档?有人疑问,既然有了 Swagger 注解为什么还要 Java 的注释呢?——因为没有了 Java 注释,你编码的时候就没有语法提示呀,IDE 又不会智能到可以提取注解的信息。原创 2023-01-14 21:51:21 · 794 阅读 · 0 评论 -
從JDK時間API演進,看時間處理
各語言平台都會提供時間處理API,視程式需求而定,它可能是個不起眼的API,然而如果經常處理時間,就會知道時間處理包含許多複雜因素。JDK目前在java.util套件提供Date與Calendar來處理時間,為了應付複雜的時間處理,JDK8納入了規範新時間處理API的JSR310。觀察從Date、Calendar到JSR310的演進,我們可瞭解到時間處理有哪些基本要素需要考量。转载 2023-01-14 16:31:02 · 159 阅读 · 0 评论 -
Database-doc 数据库文档展示工具
数据库文档展示工具(database doc),又叫数据库注释浏览工具,是一个简单的数据库展示各个字段注释的开源工具。在日常开发工作中,您有否这样的体验?原创 2022-12-17 12:26:53 · 1219 阅读 · 0 评论 -
HTTP Digest Authentication 使用心得
浏览器弹出这个原生的对话框,想必大家都不陌生,就是 HTTP Baisc 认证的机制。这是浏览器自带的,遵循 RFC2617/7617 协议。但必须指出的是,遇到这界面,不一定是 Basic Authentication,也可能是 Digest Authentication。可參照了解更多。Basic 为最简单版本,密码就用 Base64 编码一下,安全性低等于裸奔,好处是够简单;今天说的 Digest,不直接使用密码,而是密码的 MD5。虽说不是百分百安全(也不存在百分百)但安全性立马高级很多。原创 2022-12-08 16:47:51 · 1746 阅读 · 0 评论 -
写文档是件大事情,怎么弄好它?
这里的文档指 API 接口文档。写接口文档,首先原始的方式是手写,即文档脱离源码,使用 Word 或者 Markdown 写好发布给前端人员。好处是适合前期接口评审,缺点也是明显,源码和文档不同步,两边改。Swagger 这样结合源码与文档的工具给我们带来了福音。好~既然方向定了,就看看如何去实现吧,首当其冲的,怎么把 Java Comment 提炼出来?原创 2022-11-01 23:41:27 · 480 阅读 · 0 评论 -
推荐用属性代替 getter/setter
Java 不是有**属性字段(field)**的吗,——我自打初学 Java 开始,就是不明白为什么不能直接用属性,非要套 getter/setter?我项目中没发觉任何不妥,当然,你的序列化工具,如 JSON 转换,JDBC/MyBatis 转换,可能要处理一下。重点是,代码行数变小,清爽很多:)然后有人觉得 getter/setter 书写太烦了,于是有了 Lombok,这样的话 getter/setter 就消失了(起码是看不见了)。我一直没有答案,网上找到的所谓答案我觉得都是解答不到位的。原创 2022-10-29 16:05:15 · 425 阅读 · 0 评论 -
WebSocket Java 应用
HTML5 浏览器一方面普及了 WebSocket 的应用,我们同时也感受到 WebSocket 所带来的好处。怎么在 Java 中实现 WebSocket 呢?我们在本文中为大家介绍一下,如有不足,敬请提出!原创 2022-10-09 21:29:46 · 3604 阅读 · 0 评论 -
JSP 隐藏技巧大公开
发觉时隔那么多年,我还是很喜欢 JSP,——初恋的感觉!今天就让我为大家介绍鲜为人知的 JSP 编码秘密!原创 2022-10-07 12:24:58 · 1145 阅读 · 0 评论 -
Java 语言基础:如何保证某个函数只被调用一次
如何保证某个函数只被调用一次?这种场景很常见,例如初始化的时候。大概任何一个略懂编程的人都会想到用静态变量这个方法。很遗憾,在高并发的场景下,并不能保证函数只被调用一次。或者高级一点的 AtomicBoolean。原创 2022-08-21 22:44:47 · 1586 阅读 · 0 评论 -
数据验证框架 Apache BVal 再使用
数据验证框架 Apache BVal 简介原创 2022-07-04 09:50:35 · 535 阅读 · 0 评论 -
Dubbo 3 于 Spring MVC 下使用注解配置
Dubbo 是做 RPC 的,基于 Socket + 高性能协议,肯定比 HTTP 调用快多。我当期架构逐渐向分布式靠近,——其实也不是最赶什么微服务的潮流,只是觉得写好的代码,如果不独立,都是依附在某个某个项目中(即“单体”)的话,则很不稳定,有点变化的不好维护。还是独立部署运行比较稳定可用。另外一点好处是,微服务其实可以减少代码重复!你想想看,各个模块哦都独立运行了,变成一个个项目,就是把这模块高度抽象提炼,最大限度复用当期的服务或者组件............原创 2022-07-03 20:04:38 · 732 阅读 · 0 评论 -
时序数据库 InfluxDB 2.2 初探
时序数据库是什么?这里就不科普了,敬请百度一下。时序数据是写多读少的场景。InfluxDB 用 Go 语言写,开源,应该还不错。但缺点是:单机版是免费开源的,集群版本是要收费的。安装分别下载数据库 Server 和命令行工具 CLI,两个独立的程序。安装后之后,执行 influx 启动 Server,注意暴露 8086 默认端口。influx这是临时启动的,我们改为守护进程执行的,nohup ./influx &然后对 Server 进行相应的配置,有 WebUI 的界面,访问其原创 2022-07-01 21:32:03 · 1689 阅读 · 1 评论 -
JVM 中的服务器软件的稳定性
为了达到上面的要求,我们就需要对 Java 的 JVM 有一个比较深入的了解。在服务器软件稳定性方面,主要相关的东西是内存、线程、垃圾收集器,为了能够说明软件的稳定性,还需要掌握操作系统的各种查看工具和 Java 提供的各种工具转载 2022-05-24 21:18:09 · 424 阅读 · 0 评论 -
集中讨论关于缓存 Cache 的问题
转载几篇文章转载 2022-05-21 22:18:46 · 1553 阅读 · 0 评论 -
Tomcat JDBC Pool 源码实现简单分析
通过阅读 tomcat-jdbc 的源码以学习一个数据库,或者可以扩展到更广意义上的连接池的实现。选择 tomcat-jdbc 的原因是足够的轻量,源码足够的简洁,同时又不失核心的功能转载 2022-05-21 18:59:43 · 518 阅读 · 3 评论 -
Java NIO 教程
本书介绍了Java平台上的高级输入/输出,具体点说,就是使用Java 2标准版(J2SE)软件开发包(SDK)1.4及以后版本进行的输入/输出。J2SE 1.4版代号Merlin,包含可观的I/O新特性,对此我们将作详细论述。这些新的I/O特性主要包含在java.nio软件包及其子包中,并被命名为New I/O(NIO)。通过本书,您将学会如何使用这些令人兴奋的新特性来极大地提升Java应用程序的I/O效率转载 2022-05-20 17:07:06 · 423 阅读 · 0 评论 -
如何写一个 RPC 框架
在后续一段时间里, 我会写一系列文章来讲述如何实现一个RPC框架(我已经实现了一个示例框架, 代码在我的github上)转载 2022-05-19 23:25:23 · 490 阅读 · 1 评论 -
SSO 轻量级实现指南(原生 Java 实现):SSO Client 部分
作为统一的认证中心,SSO 中心无疑拥有最根本的用户状态记录,一切皆以 SSO 中心的为准。但每次访问资源的认证工作都要通讯 SSO 中心,性能成本会不会太高呢?对于 SSO 中心服务器的性能也是严重的考验。对此,笔者考虑了以下几个个解决方案。原创 2022-04-28 19:28:21 · 2348 阅读 · 0 评论 -
Tomcat 的线程池原理与 JVM 内存回收形象生动的介绍
Tomcat 的线程池原理原理我们先来看一下 Tomcat 的线程池原理:tomcat 原理如上图。Tomcat 线程池在工作的时候,实际情况是:以上述线程池为例,一开始就创建最小空闲数的线程在池里,20个,当同一时间请求数量大于最小空闲数20,比如来了50个并发请求,那么线程池还需要创建30个线程来处理请求。这时候当请求都处理完了,持续来的请求低于50个的时候,那么当时间过了60秒,并发数还是没有达到50,那么从第50个线程开始,线程池将按照,空闲时间达到60s的,开始逐个回收,49个,48个,4转载 2022-04-25 22:13:38 · 1131 阅读 · 0 评论 -
SSO 轻量级实现指南(原生 Java 实现):SSO Server 部分
OAuth 是当前单点登录(SSO)和用户授权的标准协议——现在就让我们一起动手撸一个 SSO 的实现吧!原创 2022-04-22 23:23:02 · 2482 阅读 · 3 评论 -
基于 BitMap 思想的标签框架
自乐高搭建系统在活动落地页的搭建中推广之后,搭建系统的落地页和模块数量就迅速增长。但却并没有一个入口可以帮助研发迅速的统计线上页面和页面中各模块的使用情况,无法对一些可能存在性能风险的页面进行跟踪(部分模块的特性导致该模块无法静态化,可能存在性能风险)。因此需要一个 线上页面和模块的统计解决方案用于解决此类数据统计问题。转载 2022-04-20 15:38:15 · 832 阅读 · 2 评论 -
轻量级权限系统全真做法(一)
之前做的权限系统 too old 了,重构之,于是就有了本文的全真开发过程。原创 2022-04-16 13:52:26 · 582 阅读 · 0 评论 -
大白话描述并发编程重要概念
在各类编程语言中,各种应用的开发中,为了提高执行效率,都会有涉及到多线程。而在多线程编程中,有许多的概念,这些概念在书中都以偏教科书的形式描述,并不易于理解。本文将会以更生活化的方式来描述多线程中常见的概念。转载 2022-04-15 00:01:41 · 203 阅读 · 0 评论 -
连接 HTTPS 证书二三事
HTTPS 已经普及了,我们看看在访问 https 资源遇到的事情。这里以原生 Java 的知识为背景,所以访问者为 `HttpURLConnection` 或 `HttpsURLConnection`。原创 2022-04-07 13:07:24 · 4459 阅读 · 0 评论 -
通用 DAO 接口设计
数据访问对象 DAO(Data Access Object)本质是个名词,但我们更多语境中不是作名词用,需要的是一套通用的接口去使用,至于返回的对象是什么,可以是 Java Bean 或者 Map 键对值。假设我们背后有一套数据访问机制,是 MyBatis、原生 JDBC 无所谓,只要能提供数据就可以了,那么目前需要设计一套标准的 DAO 接口,会是这样的。我们的目的是尽量可能简单衔接底层的据访问机制,提供常见的 `findById`、`findList`、`create`、`update` 等的操原创 2022-04-04 10:58:07 · 3859 阅读 · 0 评论 -
AJ 组件库之 支持热加载的配置器 EasyConfig
无论 xml 还是 yml 配置都归属 Spring 管理的,每次修改配置要重启服务器才能生效,于是思考怎么做一个不重启服务器的实现。实际上我之前都有探索过。原创 2022-03-20 17:36:30 · 327 阅读 · 0 评论 -
Java Web 简单监控
原理就是获取信息,然后解析并转化为目标结构信息输出。原创 2022-03-17 11:29:46 · 2424 阅读 · 0 评论 -
Spring MVC 用起来还是很香的
之前我有篇博文不推荐使用 Spring Boot,如今我再深挖 Spring MVC,更发掘出 Spring MVC 不俗的潜力。原创 2022-02-12 14:46:50 · 915 阅读 · 0 评论 -
MySQL 数据库定时自动备份
每天定时备份 SQL 到磁盘,通过一个简单的 Java Timer + Task 完成。原创 2022-01-17 23:08:10 · 600 阅读 · 0 评论 -
为实体提供枚举类型的支持
枚举很强大——我们用起来!原创 2022-01-02 16:41:16 · 1360 阅读 · 0 评论 -
关于 ip 操作的几个实用函数
第一种方法,适合可以连接互联网的电脑。/** * 本地 ip 地址缓存 */public static String IP;/** * 获取本机 ip,带缓存的 * * @return 本地 ip 地址 */public static String getLocalIp() { if (IP == null) IP = getLocalHostLANAddress().getHostAddress(); return IP;}/** * 获取本机局域网地址 *原创 2021-08-18 21:46:28 · 640 阅读 · 0 评论 -
开发者实用函数两则:统计代码行数与每行代码的执行时间
在需要调试的方法中隔几行插入 `Timer.set` (数字或字符)方法,程序结束前调用 `Timer.print()` 方法就行了。因为目的只是排查方法执行时间,调试完成后可以将 `set()` 方法注释掉,然后利用 Eclipse 的查错功能将所有 `Timer.set()` 方法找出来删除。原创 2021-08-13 22:22:58 · 392 阅读 · 0 评论 -
免 JAR 依赖、纯 API 调用阿里云短信接口
不用依赖庞大的 jar 就可以发短信原创 2021-07-21 17:48:35 · 705 阅读 · 4 评论 -
Spring 使用经验谈
首先说说大潮流的 Spring Boot。因为项目强制要求的缘故,我不得不将 Spring 升级到 Spring Boot,但我个人觉得,这不但没有必要(不是做微服务),而且有以下几个问题……原创 2021-07-12 23:15:23 · 345 阅读 · 3 评论