自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(151)
  • 收藏
  • 关注

原创 一文搞懂Spring @Autowired注解的使用及其原理

依赖注入(DI)是Spring核心特性之一,而@Autowired也是我们日常高频使用的Spring依赖注入方式之一,因此有必要对它的使用以及原理做一个全面的掌握。本文从@Autowired使用、原理入手记录,并扩展延伸Spring中其他具备注入功能的注解。

2023-02-12 23:11:28 9729

原创 《Spring 5.x源码解析之Spring AOP 注解驱动使用及其实现原理》

在本文,我们详细介绍Spring AOP所支持的AspectJ注解使用及其底层原理,在目标方法拦截上介绍@Before、@After、@AfterReturning、@AfterThrowing、@Around、@DeclareParents以及在切入点表达式上介绍execution、within、target、this、args、@args、@target、@within、@annotation的使用

2022-12-03 22:38:01 494

原创 《Spring 5.x源码解析之Spring AOP API整体的设计与实现》

大家好,欢迎阅读《Spring 5.x源码解析》系列,本篇作为该系列的第一篇,先入手AOP源码解析,后补齐IoC源码内容。

2022-11-20 22:34:48 268

原创 Lz4压缩算法学习

lz4是目前基于综合来看效率最高的压缩算法,更加侧重于压缩解压缩速度,压缩比并不突出,本质上就是时间换空间。对于github上给出的lz4性能介绍:每核压缩速度大于500MB/s,多核CPU可叠加;它所提供的解码器也是极其快速的,每核可达GB/s量级。...

2022-06-05 18:28:22 16380 4

原创 ProtocolBuffer源码分析(一个能实现数据压缩的序列化协议)

Protocol Buffer(以下简称Protobuf)是由Google设计的一种高效、轻量级的信息描述格式,它具有语言中立、平台中立、高效、可扩展等特性。Protocol Buffer诞生之初是为了解决索引服务器端的请求、响应新旧协议(高低版本)兼容性问题,正如它的字面意思所示-“协议缓冲区”;后被Google开源出来,逐渐发展成用于传输数据场景。相比于json、xml,Protobuf的编码长度更短、传输效率更高。它非常适合用来做数据存储、RPC数据通信等工作。

2022-05-15 14:36:48 2018 1

原创 重读Java设计模式: 桥接模式详解

在软件开发中,经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时,使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题,我们可以使用桥接模式。桥接模式是一种结构型设计模式,它将抽象部分与其实现部分分离,使它们可以独立地变化。本文将深入探讨桥接模式的概念、应用场景以及在实际项目中的实现方式。

2024-04-05 14:45:54 950

原创 重读Java设计模式: 适配器模式解析

在软件开发中,经常会遇到不同接口之间的兼容性问题。当需要使用一个已有的类,但其接口与我们所需的不兼容时,我们可以通过适配器模式来解决这一问题。适配器模式是一种结构型设计模式,它允许接口不兼容的类之间进行合作。本文将深入探讨适配器模式的概念、应用场景以及在Java中的实现方式。

2024-04-05 12:39:27 1324

原创 重读Java设计模式: 深入探讨建造者模式,构建复杂对象的优雅解决方案

建造者模式是一种创建型设计模式,它的主要目的是将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式常用于构建具有复杂结构的对象,例如包含多个部件的对象,或者对象的构建过程需要进行多个步骤。建造者模式是一种创建型设计模式,通过将构建过程与产品的表示分离,使得同样的构建过程可以创建不同的表示。本文介绍了建造者模式的概念、结构、优点、应用场景,并提供了示例代码进行说明。建造者模式可以有效地解决构建复杂对象时的代码冗长、难以维护的问题,是一种值得推荐的设计模式。

2024-03-31 10:35:10 1059

原创 重读 Java 设计模式: 深入探讨原型模式,灵活复制对象

通过本文的学习,我们了解了原型模式的原理、应用场景以及实现方式。原型模式通过复制现有对象来创建新对象,可以提高代码的效率和可维护性,适用于对象创建过程比较复杂、需要保持对象属性一致或动态生成对象的情况。在实现原型模式时,需要注意选择合适的拷贝方式,以确保复制出的新对象能够满足业务需求。希望本文对你理解和应用原型模式有所帮助,欢迎继续关注我们后续的设计模式深入探讨系列文章。

2024-03-31 10:00:22 1207

原创 Spring 事件广播机制详解

写这篇文章的初衷源自对 Spring 框架中事件机制的好奇心。在编写观察者模式代码示例时,我突然想起了 Spring 框架中支持多事件监听的特性,例如ContextClosedEvent、ContextRefreshedEvent、ContextStartedEvent等等。传统的观察者模式通常是基于单一事件的,但 Spring 框架却提供了一种更为灵活的机制,可以处理多个不同类型的事件。因此,我决定深入研究 Spring 框架中多事件监听的实现机制,并将我的学习总结记录下来。

2024-03-28 00:07:10 914 1

原创 重读 Java 设计模式: 深入探讨工厂模式,创建对象的灵活性与可维护性

今天我们来继续学习创建型设计模式中的工厂模式。在软件开发中,工厂模式是一种常见的设计模式,旨在提供一种灵活、可扩展的方式来创建对象实例。工厂模式通常分为简单工厂模式和抽象工厂模式两种主要形式,它们在不同情境下各具优势,可以帮助开发人员更好地管理对象的创建过程,并提高代码的可维护性和可扩展性。

2024-03-17 00:20:10 1073

原创 重读 Java 设计模式: 解析单例模式,保证唯一实例的创建与应用

单例模式是设计模式中最简单但又最常用的一种模式之一。它确保某个类只能有一个实例,并提供了全局访问点,使得该实例在整个应用程序中都可以被访问。在本文中,我们将深入探讨单例模式的实现方式、应用场景以及实践指南。

2024-03-10 17:00:04 1021

原创 重读 Java 设计模式: 探索经典之道与 Spring 框架的设计

记得大学刚毕业那会儿,想学点东西,于是拿出了《Head First 设计模式》这本书,就开始了阅读,我曾对这些模式感到晦涩难懂。然而,随着工作岁月的增长,我逐渐领悟到设计模式的价值,尤其是在实践中,特别是在Spring这样的大型设计框架中。

2024-03-03 23:33:31 1489

原创 探秘SpringBoot启动流程:原理解析与自定义扩展

SpringBoot是当今Java开发中最受欢迎的微服务框架之一,其简化了Java应用的开发和部署过程。了解SpringBoot的启动流程对于深入理解其原理和内部机制至关重要。本文将深入分析SpringBoot的启动过程,探讨其中的关键步骤和机制,后基于这些机制,我们尝试做一些扩展和一些个性化内容。

2024-03-03 00:17:30 925

原创 Spring 框架简介: 聊聊特性与模块

在当今的软件开发领域中,Spring框架是一个备受推崇的开发框架,它以其强大的功能和灵活的设计而闻名于世。本文将简要介绍Spring框架的特性以及其主要模块,帮助读者更好地理解这个广泛应用的工具。

2024-02-28 23:45:21 577

原创 解密高并发系统设计:聊聊负载均衡算法

随着公司业务的飞速发展,以及业务的多样性,用户数会迅猛增长,系统的流量会越来越大。因此,大规模的并发用户访问会对系统的处理能力造成巨大的压力,系统必须要有足够强的处理能力才能应对。这篇文章就来介绍一下高并发系统的通用设计原则之一:负载均衡。

2024-02-25 15:34:12 566

原创 分布式系统简介

当今互联网时代,随着数字化转型的加速、用户需求的不断变化以及用户规模的扩大,企业对于构建高效、可靠、可扩展的软件系统提出了更高的要求。传统的单体系统在面对这些挑战时,往往显得力不从心,因此越来越多的企业开始将目光投向了分布式系统架构。

2024-02-24 16:43:21 843

原创 解锁Java SPI:开发者必知的动态服务加载技巧

SPI(Service Provider Interface)服务提供接口,是Java提供的一种服务发现机制。它允许服务提供者在运行时被查找或者加载,增加了程序的可扩展性。SPI的核心思想是面向接口编程,实现解耦合。开发者只需要通过接口来引用服务,具体的实现类可以在运行时动态加载,从而替换不同的实现。Java SPI是一种强大的服务发现机制,它通过ServiceLoader的动态加载能力,为Java应用提供了高度的扩展性和灵活性。了解和掌握SPI机制,对于构建模块化、可扩展的Java应用至关重要。

2024-02-21 13:01:20 631

原创 深入解析 Spring 事务机制

在数据库和软件开发领域,事务是一组相关的操作,被视为不可分割的执行单位。事务具有四个关键数据,简称ACID原子性(Atomicity):事务是原子的,它要么全部执行成功,要么完全不执行。如果事务的任何部分失败,整个事务将回滚到初始状态,不会留下部分完成的结果。一致性(Consistency):事务在执行前后,数据库的状态应保持一致。这意味着事务的执行不会破坏数据库的完整性约束,如唯一性约束、外键约束等。隔离性(Isolation):多个事务并发执行时,每个事务都应该被隔离,以防止彼此之间的干扰。

2024-02-06 21:59:26 924

原创 玩转 SpEL 表达式

通过本文,我们详细讨论了 SpEL 的语法、特性和应用场景。从简单的字面量表达式到复杂的类型引用,相信大家已经掌握了在 Spring 项目中灵活使用 SpEL 的关键知识。在总结中,不要忘记不断实践和深入研究,以便更好地运用 SpEL 提高代码的可读性和可维护性。

2024-01-21 23:43:10 808

原创 Spring 依赖注入概述、使用以及原理解析

我们本文主要来介绍依赖注入的使用示例及其原理 依赖注入(Dependency Injection,简称DI)是一种设计模式,它用于实现对象之间的松散耦合。在依赖注入中,一个对象不再负责创建或查找它所依赖的对象,而是将这些依赖关系通过外部传递进来,外部指的就是 IoC 容器,IoC 容器负责对象的创建、管理和注入,我们也常说 DI 是实现 IoC 的一种具体技术。这种方式有助于提高代码的可维护性、可测试性,同时降低了组件之间的耦合度。

2023-12-24 21:46:58 1095

原创 Spring 依赖查找知识点总结

源码在我github的仓库中,可以克隆下来 直接执行。我们本文主要来介绍依赖查找的使用示例依赖查找并不是 Spring 框架特有的概念,它是一种在软件开发中获取依赖对象的方式。它通常用于获取运行时需要的服务、组件或其他对象的引用。在面向对象编程中,依赖通常体现为一个对象需要另一个对象的服务或功能。在不同的编程框架和容器中,依赖查找的方式可能会有所不同。Java中的依赖查找在纯 Java 环境中,依赖查找通常通过构造函数、方法参数或其他手段来获得依赖对象的引用。

2023-12-17 23:26:14 974

原创 Spring Bean基础

为什么要先掌握 Spring Bean 的基础知识?我们知道 Spring 框架提供的一个最重要也是最核心的能力就是管理 Bean 实例。Spring框架的核心是IoC(Inversion of Control)容器,而Bean是IoC容器的基本构建块。理解Spring Bean的概念和使用方式是学习和使用Spring框架的第一步。Spring框架通过依赖注入实现了对象之间的解耦。

2023-12-10 17:54:21 1039

原创 IDEA中查看整个项目代码行数

近期正在手撸Spring源码,想要看下自己写了多少行代码。记录下如何查看项目的代码行数,方便日后查阅。

2023-10-15 00:26:36 339

原创 (二)实现Bean属性依赖注入功能【手撸Spring】

好了,本文介绍了构造器注入、setter方法注入的实现原理、Bean依赖的问题以及循环依赖问题Spring是如何做的,基于原理我们实现了一个非常简单的属性注入功能,目前类结构还不复杂,大家可以在我的github项目中直接查看,有不明白的地方也可以评论我。

2023-10-10 00:14:23 176

原创 (一)实现一个简易版IoC容器【手撸Spring】

相信大家在看本篇文章的时候,对IoC应该有一个比较清晰的理解,我在这里再重新描述下:它的作用就是实现一个容器将一个个的Bean(这里的Bean可以是一个Java的业务对象,也可以是一个配置对象)统一管理起来。在Java中,我们创建一个对象最简单的方法是使用new关键字。Spring框架的IoC容器则是将创建Bean的动作与使用Bean解耦,将应用层程序员无需关注底层对象的构建以及其生命周期,以便更好的专注于业务开发。本节我们则开始进入手写Spring框架的第一步:实现一个最简易的IoC容器。

2023-10-07 23:10:14 346

原创 JVM G1垃圾回收器学习笔记

最近在工作中遇到频繁FullGC且YoungGC时间有时特别长的情况,而自己对JVM的垃圾回收也是一知半解,因此需要对JVM做系统的了解,为快速解决工作中的问题,能有效分析GC日志和业务代码,先从G1垃圾回收器开始学习(工作中系统采用的就是G1垃圾回收器)GC全称Garbage Collection,意为垃圾收集。在系统不停机运行中,应用会不断创建对象,也就是不断的在内存中进行空间分配。但系统内存是一定的,不可能支持无限制的内存分配,因此会针对应用持续运行中不再使用的对象所占用的内存空间进行回收。

2023-09-20 00:15:15 345

原创 CompletableFuture使用与原理解析

在并发编程中,我们一般会使用Runnable编写任务的内容然后提交给线程池交由线程池调度线程执行。这种情况我们通常是针对不关心任务执行的结果,但如果关心任务执行的结果,并且根据执行结果执行后续的动作,这个时候就需要配合使用Callable+Future来实现了,其中Callable关注异步任务的执行,而Future则关注异步任务的执行结果,它提供了方法来检查任务是否完成,并在完成后获取结果。} });

2023-09-12 23:52:00 99

原创 ThreadLocal深度解析

在并发编程中,导致并发bug的问题都会归结于对共享变量的操作不当。多个线程同时读写同一共享变量存在并发问题,我们可以利用写时复制、不变性来突破对原数据的写操作,没有写就没有并发问题,而本篇文章所介绍的技术是突破共享变量,没有共享变量也不会有并发问题。Java中避免线程共享的一大利器就是ThreadLocal,我们本篇文章重点讲述它的底层原理、常见的一些用途、创建和使用等。是 Java 的一个类,位于java.lang包下。

2023-08-21 23:53:17 687 1

原创 信号量与管程

我们知道,在并发领域内,需要关注分工、同步与互斥,针对分工问题,就是将任务拆解,分配给多个线程执行,而在多线程执行的过程中,需要解决线程之间的协作与互斥问题进而保证并发安全。那么解决这类问题的方案是什么呢?没错就是信号量和管程。信号量的概念是由荷兰计算机科学家Edsger W. Dijkstra在1960年引入的。Dijkstra引入了P(Proberen,荷兰语中的"try")和V(Verhogen,荷兰语中的"increment")这两个操作,并使用它们来解决各种同步问题,如著名的哲学家进餐问题。

2023-08-19 16:14:31 164

原创 SpringBoot自动装配原理学习与实战运用

我们知道SpringBoot就是框架的框架,它解决了Spring在开发过程中繁琐的配置问题。例如在引入web、aop、data、cache等等场景,以往我们使用Spring时,会需要向容器中手动配置DispatchServlet、 AspectJAutoProxyingConfiguration等等配置类,而使用SpringBoot框架后,只需要引入spring-boot-starter-xxx的jar包,即可自动完成相关场景的配置。这项技术SpringBoot是如何帮助我们实现的呢?本篇文章就来详细聊聊

2023-04-09 16:22:40 1145 1

原创 并发编程之死锁问题介绍

死锁问题在并发编程中是一个非常致命的问题,问题一旦产生,只能通过重启机器、修改代码来修复问题,本篇我们通过一小段内容介绍下死锁以及如何死锁的预防

2023-02-26 15:44:39 1078 2

原创 Spring IoC容器之常见常用注解以及注解编程模型简介

本篇文章主要学习记录Spring中的核心注解,罗列常见常用的注解以及Spring中的注解编程模型介绍

2023-02-19 18:57:56 1347 2

原创 Java I/O之文件系统

在学习文件系统之前,需要了解下Java在I/O上的发展史:在Java7之前,打开和读取文件需要编写特别笨拙的代码,涉及到很多的InputStream、OutputStream等组合起来使用,每次在使用时或许都需要查一下文档才能记得如何打开一个文件;而在Java 7面世后,这些被人诟病的设计得到了巨大的改进,这些新元素被打包放在了java.nio.file之下。这个包对Java对文件的操作提升到了可以与其他编程语言媲美的程度。

2023-02-16 23:00:42 483

原创 Linux指令笔记

本篇文章主要记录下在日常使用Linux系统时一些经常使用的命令,作为自己的一个备忘录。内容主要包括:帮助命令、有关目录和文件的操作命令、有关用户的操作命令、有关用户组的操作命令、有关权限的相关操作命令

2023-02-07 22:58:52 484

原创 Java I/O流基础类介绍

在我们日常工作中,或多或少会对文件进行各种各样的操作。有些我们是亲自去处理的,例如在我工作中,流量读取策略信息时,我们就是将策略存放到本地文件当中,在生成运行时策略信息的时候,我们会先从本地文件中读取;也有些是我们看不到被框架底层封装的,例如日志框架将日志写入磁盘,日志监控读取磁盘文件等操作。这些I/O流的操作涉及我们工作的方方面面,因此对它进行一定的学习是对我们有很大的帮助的,例如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等等。

2023-02-05 17:21:04 521

原创 Spring AOP学习笔记(一)

AOP(Aspect Oriented Program),即面向切面编程,它提供另一种考虑程序结构的方法,补充了面向对象编程(OOP)。面向对象编程中模块化的关键单元是类,而在AOP中模块化的单元是切面。切面支持跨多个类型和对象的关注点(如事务管理)的模块化。

2022-10-09 22:52:12 438

原创 《JVM学习笔记》字节码基础

代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,确实编程语言发展的一大步。JVM提出的字节码数据格式的规范使得它不在仅仅服务于Java,而面向全语言,只要该语言能编译成符合JVM规范的字节码文件,就能运行在JVM之上进行跨平台运行。本篇文章意在学习class文件结构,了解这一平台无关性的基石。

2022-09-25 22:27:05 528

原创 保证高并发性能以及数据安全的硬件层支持

学习JMM之前必须要了解的硬件层基础知识

2022-09-18 23:06:21 484

原创 【IoC】一文搞定Spring依赖注入日常使用以及底层原理

依赖注入,可以通俗的理解为属性填充。但与简单属性填充有些不同。我们知道Spring实现了IoC,也就是控制反转,即将对象实例的控制权进行了反转,Spring替我们创建对象,而初始化对象的过程就称为依赖注入,这个依赖可以基础类型,也可以是引用类型。本文涵盖使用和原理分析

2022-09-04 21:46:57 339

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除