
【Java - Java Base】
文章平均质量分 93
Java 基础——从入门到精通,实例讲解
小小工匠
show me the code ,change the world
展开
-
Java - 深入理解Servlet:Java Web开发的核心技术
Servlet是一个运行在服务器端的Java程序,用于处理客户端的HTTP请求并生成响应。它可以处理各种类型的请求,包括GET、POST、PUT、DELETE等。Servlet通常用于生成动态Web内容,如HTML页面、JSON数据或XML文档。Servlet是Java Web开发的核心技术之一,它为处理HTTP请求和生成动态Web内容提供了强大的支持。从1997年诞生至今,Servlet经历了多次重大更新,逐渐适应了现代Web应用的需求。原创 2025-01-08 12:22:46 · 2432 阅读 · 0 评论 -
Java - 日志体系_总结篇(全)
阶段日志框架描述初期阶段log4j最初的Java日志框架,成为事实标准,被广泛使用。JDK自带日志JULJDK内置的日志框架,简化了日志的使用,但相比log4j缺少灵活性和高性能。统一接口阶段JCL提供统一的日志API接口,允许在运行时选择具体的日志实现(log4j、JUL等)。简化设计阶段SLF4J提供统一的API门面,允许后端选择具体的日志框架,替代JCL,简化了日志接口的设计。性能优化阶段Logback。原创 2024-12-29 10:45:00 · 3304 阅读 · 0 评论 -
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成logback 及 原理分析
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。是 Logback 提供的一个实现,用于将 SLF4J 的日志接口与 Logback 的日志实现绑定。接口,因此可以通过 SLF4J 的 API 记录日志,并将日志委托给 Logback 来处理。是 Logback 中用于管理日志的核心对象,它实现了 SLF4J 的。原创 2024-12-29 09:00:00 · 3062 阅读 · 0 评论 -
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成Log4j2.x 及 原理分析
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。请注意,启用 SLF4J 的库意味着仅添加一个强制依赖项,即 slf4j-api.jar。如果在类路径上找不到绑定/提供程序,则 SLF4J 将 default 为 no-operation 实现。获取日志记录器实例,并使用 SLF4J API 记录日志。原创 2024-12-29 07:45:00 · 2730 阅读 · 0 评论 -
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成Log4j1.x 及 原理分析
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。请注意,启用 SLF4J 的库意味着仅添加一个强制依赖项,即 slf4j-api.jar。它使用 Log4j 1.x 的原生方式来创建日志记录器,然后将其封装成 SLF4J 的。类的作用是为 SLF4J 提供 Log4j 的。SLF4J 的日志实现通过。原创 2024-12-29 06:30:00 · 2760 阅读 · 0 评论 -
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J集成JUL 及 原理分析
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。请注意,启用 SLF4J 的库意味着仅添加一个强制依赖项,即 slf4j-api.jar。,该适配器会将 SLF4J 日志调用转发到 JDK 自带的日志实现。类的作用是为 SLF4J 提供底层日志框架的绑定。),但实际的日志输出是通过 JDK 自带的。原创 2024-12-28 21:02:50 · 2469 阅读 · 0 评论 -
Java - 日志体系_Simple Logging Facade for Java (SLF4J)日志门面_SLF4J实现原理分析
Simple Logging Facade for Java (SLF4J) 用作各种日志记录框架(e.g. java.util.logging、logback、log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志记录框架 时间。上述警告表示类路径中找到多个绑定,SLF4J 会随机选择一个日志框架进行绑定。这个选择是由 JVM 的类加载机制决定的,并且会在控制台输出警告。类文件,SLF4J 会输出警告信息,告诉用户存在多个日志框架绑定的情况。)根据所绑定的日志框架不同返回不同类型的。原创 2024-12-28 20:29:56 · 2264 阅读 · 0 评论 -
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
这 Commons Proper 是一个协作和共享的地方,其中 来自整个 Apache 社区的开发人员都可以 一起讨论由 Apache 项目共享的项目,以及 Apache 用户。共享资源开发人员将努力确保他们的 组件对其他库的依赖性最小,因此 这些组件可以轻松部署。的 API 来记录日志,并且通过 SLF4J 和 Logback 完成实际的日志输出。类似,只不过它会获取日志的调用位置(如类名、行号等)以提供更详细的日志信息。文件用于定义日志输出的格式和方式。接口的实现,它们负责将。原创 2024-12-28 15:26:19 · 3137 阅读 · 0 评论 -
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_适配Log4j2 及 源码分析
这 Commons Proper 是一个协作和共享的地方,其中 来自整个 Apache 社区的开发人员都可以 一起讨论由 Apache 项目共享的项目,以及 Apache 用户。此外,共享资源 组件将尽可能保持其接口稳定,因此 Apache 用户(包括其他 Apache 项目)可以实现 这些组件。是一个用于日志记录的抽象层,它允许开发人员通过一个统一的接口在不同的日志框架(如 Log4j、Logback、JDK Logging 等)之间切换。API 的同时,享受 Log4j2 提供的高效性能和强大功能。原创 2024-12-28 12:32:07 · 2669 阅读 · 0 评论 -
Java - 日志体系_Apache Commons Logging(JCL)日志接口库
Apache Commons Logging(简称 JCL)是一个轻量级的日志接口库,提供了日志记录的抽象层。它允许开发人员编写独立于具体日志实现的代码,而具体的日志实现(如Log4j、SLF4J或)可以在运行时配置。这种设计简化了日志库的集成和切换。JCL内置的SimpleLog是一个轻量级实现,适用于没有复杂日志需求的小型项目。:设置默认日志级别。:是否显示日期时间。JCL为日志记录提供了一种统一的接口,虽然不如SLF4J现代化,但在历史遗留系统中仍有广泛的使用价值。原创 2024-12-23 22:07:45 · 3326 阅读 · 0 评论 -
Java - 超精简的树结构工具类
树形结构是一种层次化的数据组织方式,常用来表示具有父子关系的对象集合。每个节点包含数据和一个或多个子节点,最顶层的节点称为根节点。查找:在树中快速定位目标节点。插入/删除:在节点集合中增加或移除元素。二叉树是每个节点最多有两个子节点的树形结构,通常称为左子树和右子树。它是最基础的树形结构之一,广泛应用于各类算法与数据结构中。节点(Node):二叉树的基本单位,包含一个值和指向子节点的引用。根节点(Root):二叉树的第一个节点,其他节点通过根节点链接。叶子节点(Leaf):没有子节点的节点。原创 2024-12-14 13:57:46 · 2810 阅读 · 0 评论 -
Plugin - 插件开发06_开源项目JPom中的插件实现机制
接下来我们主要对IPlugin接口及其实现,以及插件的加载和管理机制进行分析,分为如下几个点插件接口与实现分析插件工厂初始化分析插件项包装类解析插件工厂方法解析插件加载与资源释放机制。原创 2024-12-08 20:53:49 · 2765 阅读 · 0 评论 -
Plugin - 插件开发05_Solon中的插件实现机制
本系列在内核知识的基础上做进一步延申。插件插件扩展体系(Spi)插件体外扩展体系(E-Spi)插件热插拔管理机制(H-Spi)这些知识,为构建大的项目架构会有重要帮助。Solon的插件扩展机制简化了模块化的开发和插件的管理,允许开发者将可复用的功能封装成插件,并通过配置文件进行管理和加载。插件的核心作用是在应用启动时提供初始化和生命周期管理的功能,使得模块化的能力可以灵活地集成到系统中。插件的类型非常多样,例如像@Tran@Cache。原创 2024-12-07 21:53:01 · 2984 阅读 · 0 评论 -
Plugin - 插件开发04_Spring Boot中的SPI机制与Spring Factories实现
首先,定义一个简单的服务接口,File;接着,我们创建几个实现类, 它们分别实现了接口。原创 2024-12-07 19:56:19 · 2929 阅读 · 0 评论 -
Plugin - 插件开发03_Spring Boot动态插件化与热加载
首先,我们需要定义一个插件接口,该接口为插件提供统一的方法。插件实现类将根据此接口进行开发。接口 IPlugin 包含一个方法 customPluginMethod,插件类可以通过实现该接口来定义具体的插件行为。原创 2024-12-07 16:22:42 · 3352 阅读 · 0 评论 -
Plugin - 插件开发02_使用反射机制和自定义配置实现插件化开发
为避免 ServiceLoader 方式中的 META-INF 配置文件管理的复杂性,可以自定义配置文件,灵活配置插件的实现类。原创 2024-12-05 20:00:00 · 3115 阅读 · 0 评论 -
Plugin - 插件开发01_SPI的基本使用
SPI(Service Provider Interface)是Java提供的一种服务发现机制,它允许第三方为应用程序提供插件式的扩展。1.服务接口(Service Interface): Java接口,定义了服务的行为。2.服务提供者(Service Provider): 实现了上述服务接口的具体类。3.服务提供者配置文件(Service Provider Configuration File): 位于META-INF/services/目录下,文件名必须是服务接口的全限定名。原创 2024-12-05 18:45:00 · 2580 阅读 · 0 评论 -
Java Review - SPI 原理、实现与最佳实践
SPI(Service Provider Interface)是Java的一种机制,用于实现服务的动态发现和加载。SPI允许开发者在不修改应用程序代码的情况下,通过配置文件动态地为接口添加不同的实现。原创 2024-08-26 20:15:00 · 4398 阅读 · 0 评论 -
Java - 深入四大限流算法:原理、实现与应用
限流算法是一种在分布式系统中广泛使用的技术,用于控制对系统资源的访问速率,以保护系统免受恶意攻击或突发流量导致的过载。API 网关限流:在微服务架构中,API 网关通常是系统对外的唯一入口,需要限制单个用户或IP在一定时间内的请求次数,以保护后端服务不受恶意请求或突发流量的冲击。分布式系统中的服务限流:在分布式系统中,各个服务之间可能会有调用关系,通过限流可以控制服务间的调用频率,避免服务间因为调用过于频繁而造成的服务过载。微服务间的接口限流。原创 2024-01-21 11:43:20 · 7481 阅读 · 0 评论 -
动态编译 - Dynamically Compile and Load External Java Classes
读取源代码: 首先,需要获取到外部的Java源代码。这通常是通过读取文件、网络资源或者数据库中的源代码字符串来实现的。编译源代码: 接下来,需要使用Java编译器来编译这些源代码。这可以通过调用javac命令行工具或者使用Java API中的编译器API(如)来实现。生成字节码: 编译过程会生成字节码文件(.class文件)。这些字节码文件包含了编译后的Java类的信息。加载字节码: 最后,需要将这些字节码文件加载到Java虚拟机(JVM)中。这可以通过创建一个子类并重写其loadClass。原创 2024-01-07 05:45:00 · 7203 阅读 · 0 评论 -
Java Review - MapStruct_使用 Intellij 和 Maven Debug 分析MapStruct实现原理
通过定义映射接口和相应的映射方法,MapStruct 在编译时生成这些接口的实现类,从而实现了类型安全的对象映射,避免了手动编写繁琐且容易出错的映射代码。例如,当你使用MapStruct注解来标注两个Java Bean类,并希望通过注解处理器生成它们之间的映射代码时,MapStruct的注解处理器就会被javac调用。MapStruct 使用注解处理器技术,结合了JSR 269的功能,实现了在编译时生成高效的映射代码,从而提供了更快的执行速度和更好的类型安全性。命令来切换到POM文件所在的目录。原创 2024-01-05 06:15:00 · 7258 阅读 · 0 评论 -
Java Review - MapStruct全掌握:9个案例探究高效快捷的Java对象映射
MapStruct是一个代码生成库,旨在简化Java Bean之间的映射。它允许开发者在定义了映射规则后,通过注解处理器在编译时自动生成映射代码。MapStruct遵循“约定优于配置”的原则,大多数情况下,它能够智能地处理常见的映射场景,而无需开发者编写繁琐的映射逻辑。MapStruct允许在映射器中定义自定义方法,实现复杂的映射逻辑。例如,可以定义一个方法,将源对象中的某个字段进行转换后赋值给目标对象Entity@Data// 出厂日期 , String类型@Data。原创 2024-01-05 04:45:00 · 8420 阅读 · 0 评论 -
Java Review - Java命令行参数指南:掌握 -D 和 -- 的使用技巧
在Java应用中,参数传递可以通过命令行选项进行,其中包括使用-D和--作为前缀的选项。原创 2023-11-25 09:45:00 · 7917 阅读 · 0 评论 -
Java Review - 关于代理的二三事儿
代理模式是一种结构型设计模式,其目的是为其他对象提供一种代理以控制对这个对象的访问。在 Java 中,代理模式有两种形式:静态代理动态代理在代理模式中,代理类和目标类之间有一个抽象接口,代理类实现了这个接口,而目标类则实现了具体的业务逻辑。通过代理类调用目标类,可以实现对目标类的访问控制、权限检查、审计等功能。代理模式在 Java 中应用广泛,例如可以使用代理模式来实现对网络请求的缓存、访问控制、限流等功能。静态代理是一种在编译时生成代理类的方式。在静态代理中,代理类和委托类的关系在运行前就确定了。原创 2023-08-14 20:15:00 · 10562 阅读 · 0 评论 -
Java Review - 使用Event Bus实现目录变化的监控
文章目录Pre需求Event Bus案例实战PreJava Review - Java进程内部的消息中间件_Event Bus设计模式需求监控文件的实时变化 , 就这一句话???分析一下其中一个有问题的思路:程序首次启动时获取该文件的最后修改时间并且做文件的首次解析,然后每隔一段指定的时间检查一次文件最后被修改的时间,如果与记录的时间相等则等待下次的采集(Balking Pattern),否则进行新一轮的采集并且更新时间。这。。。。有问题啊 , 比如在采集时间间隔内,文件发生了N次原创 2022-01-07 02:21:38 · 34517 阅读 · 2 评论 -
Java Review - 并发编程_ThreadLocalRandom实现原理&源码分析
文章目录概述Random的局限性ThreadLocalRandom使用及原理ThreadLocalRandom源码分析小结概述ThreadLocalRandom类是JDK 7在JUC包下新增的随机数生成器,它弥补了Random类在多线程下的缺陷。我们这里主要讲解为何要在JUC下新增该类,以及该类的实现原理。Random的局限性ThreadLocalRandom使用及原理ThreadLocalRandom源码分析小结...原创 2021-11-28 23:05:04 · 29161 阅读 · 0 评论 -
Java Review - 并发编程_伪共享
文章目录what's 伪共享what’s 伪共享为了解决计算机系统中主内存与CPU之间运行速度差问题,会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。这个Cache一般是被集成到CPU内部的,所以也叫 CPU Cache .下图所示是两级Cache结构在Cache内部是按行存储的,其中每一行称为一个Cache行。Cache行(如下图所示)是Cache与主内存进行数据交换的单位,Cache行的大小一般为2的幂次数字节。当CPU访问某个变量时,首先会去看CPU Cache内是否原创 2021-11-28 19:57:40 · 29122 阅读 · 0 评论 -
Java Review - 并发编程_Unsafe
文章目录UnsafeUnsafe 提供的几个主要的方法使用Unsafe类UnsafeJDK 的 rt.jar 包中的 Unsafe 类提供了硬件级别的原子性操作,Unsafe 类中的方法都是native 方法,它们使用 JNI 的方式访问本地 C++ 实现库。Unsafe 提供的几个主要的方法下面我们来了解一下 Unsafe 提供的几个主要的方法以及编程时如何使用 Unsafe 类做一些事情。使用Unsafe类...原创 2021-11-27 15:42:11 · 29295 阅读 · 0 评论 -
Java Review - 并发编程_锁的分类
文章目录乐观锁与悲观锁公平锁与非公平锁独占锁与共享锁可重入锁自旋锁乐观锁与悲观锁乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面也引入了类似的思想。悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改,所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制,即在数据库中,在对数据记录操作前给记录加排它锁。如果获取锁失败,则说明数据正在被其他线程修改,当前线程则等待或者抛出异常。如果获取锁成功,则对记录进原创 2021-11-27 10:46:06 · 28197 阅读 · 0 评论 -
Java Review - 并发编程_前置知识二
文章目录What's 多线程并发编程What’s 多线程并发编程首先要澄清并发和并行的概念并发是指同一个时间段内多个任务同时都在执行,并且都没有执行结束并行是说在单位时间内多个任务同时在执行并发任务强调在一个时间段内同时执行,而一个时间段由多个单位时间累积而成,所以说并发的多个任务在单位时间内不一定同时在执行。在单CPU的时代多个任务都是并发执行的,这是因为单个CPU同时只能执行一个任务。在单CPU时代多任务是共享一个CPU的,当一个任务占用CPU运行时,其他任务就会被挂起,当占用CP原创 2021-11-23 23:06:29 · 27671 阅读 · 0 评论 -
Java Review - 使用Timer时需要注意的事情
文章目录概述问题复现概述 先说结论 当一个Timer运行多个TimerTask时,只要其中一个TimerTask在执行中向run方法外抛出了异常,则其他任务也会自动终止。问题复现原创 2021-11-21 20:29:19 · 27901 阅读 · 0 评论 -
Java Review - SimpleDateFormat线程不安全原因的源码分析及解决办法
文章目录概述概述SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,在日常开发中经常会用到,但是由于它是线程不安全的,所以多线程共用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错。这里来揭示它为何是线程不安全的,以及如何避免该问题。...原创 2021-11-21 14:55:37 · 28238 阅读 · 0 评论 -
Java Review - 并发组件ConcurrentHashMap使用时的注意事项及源码分析
文章目录概述案例概述ConcurrentHashMap虽然为并发安全的组件,但是使用不当仍然会导致程序错误。我们这里通过一个简单的案例来复现这些问题,并给出开发时如何避免的策略。案例来个简单的例子,比如有一个注册中心 , 客户端要注册...原创 2021-11-21 10:44:34 · 28178 阅读 · 1 评论 -
Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例&源码分析
文章目录概述Why 内存泄露 ?概述ThreadLocal的基本使用我们就不赘述了,可以参考每日一博 - ThreadLocal VS InheritableThreadLocal VS TransmittableThreadLocal直接进入主题。 我们今天要聊的是使用ThreadLocal会导致内存泄漏的原因,并给出使用ThreadLocal导致内存泄漏的案例及源码分析。Why 内存泄露 ?...原创 2021-11-21 09:02:02 · 28108 阅读 · 1 评论 -
Java Review - 线程池使用FutureTask的小坑
文章目录概述问题复现概述先说结论 线程池使用FutureTask时如果把拒绝策略设置为 DiscardPolicy和 DiscardOldestPolicy,并且在被拒绝的任务的Future对象上调用了无参get方法,那么调用线程会一直被阻塞。问题复现import java.util.concurrent.*;/** * @author 小工匠 * @version 1.0 * @description: TODO * @date 2021/11/21 0:11 * @ma原创 2021-11-21 01:05:09 · 28072 阅读 · 1 评论 -
Java Review - 线程池资源一直不被释放案例&源码分析
文章目录概述概述在日常开发中为了便于线程的有效复用,经常会用到线程池,然而使用完线程池后如果不调用shutdown关闭线程池,则会导致线程池资源一直不被释放。下面通过简单的例子来说明该问题。...原创 2021-11-20 23:31:18 · 30032 阅读 · 1 评论 -
Java Review - 创建线程和线程池时建议指定与业务相关的名称
文章目录概述不指定线程名称为何难定位问题Thread默认的线程名称概述在日常开发中,当在一个应用中需要创建多个线程或者线程池时最好给每个线程或者线程池根据业务类型设置具体的名称,以便在出现问题时方便进行定位。下面就通过实例来说明不设置为何难以定位问题,以及如何进行设置。不指定线程名称为何难定位问题import java.util.concurrent.TimeUnit;/** * @author 小工匠 * @version 1.0 * @description: TODO *原创 2021-11-20 12:28:52 · 26927 阅读 · 0 评论 -
Java Review - LinkedHashMap & LinkedHashSet 源码解读
文章目录Pre概述数据结构PreJava Review - HashMap & HashSet 源码解读 中我们讲了HashSet和HashMap 。 那同样的套路 , LinkedHashSet和LinkedHashMap在Java里也有着相同的实现,LinkedHashSet仅仅是对LinkedHashMap做了一层包装,也就是说LinkedHashSet里面有一个LinkedHashMap(适配器模式)。故我们还是重点分析LinkedHashMap。概述LinkedH原创 2021-11-17 00:00:00 · 26683 阅读 · 0 评论 -
Java Review - HashMap & HashSet 源码解读
文章目录概述构造函数概述HashMap实现了Map接口,即允许放入key为null的元素,也允许插入value为null的元素;除该类未实现同步外,其余跟Hashtable大致相同;跟TreeMap不同,HashMap容器不保证元素顺序,根据需要该容器可能会对元素重新哈希,元素的顺序也会被重新打散,因此不同时间迭代同一个HashMap的顺序可能会不同。根据对冲突的处理方式不同,哈希表有两种实现方式,一种开放地址方式(Open addressing),另一种是冲突链表方式(Se原创 2021-11-15 23:06:25 · 26963 阅读 · 0 评论 -
Java Review - PriorityQueue源码解读
文章目录PrePriorityQueue 概述PreJava Review - ArrayList 源码解读Java Review - LinkedList源码解读Java Review - Queue和Stack 源码解读PriorityQueue 概述Java Review - Queue和Stack 源码解读以Java ArrayDeque为例讲解了Stack和Queue,还有一种特殊的队列叫做PriorityQueue,即优先队列。优先队列的作用是能保证每次取出的元素都是队列中权原创 2021-11-14 22:43:26 · 25947 阅读 · 0 评论