- 博客(167)
- 资源 (5)
- 收藏
- 关注
原创 【Spring 底层原理】手搓一个Spring框架
最近工作接触到的知识比较底层,因此为了突破瓶颈,彻底搞明白Spring到底帮我们干了些啥。学习了很多关于Spring的知识,看了这么多资料能讲清楚的人不多,我将尝试将Spring的原理和读者讲明白。我们手写一个简单的Spring框架用于搞清楚其核心原理,这个手写框架我把它叫做Summer框架,平行时空的Spring框架。 追求高质量文章需要兄弟萌支持,一键三连!
2024-09-22 21:58:03 961
原创 概念辨析(1)
注解表示该函数为事务方法,其中的操作要么全部执行成功或者全部不执行。如果一个所谓的“原子性函数”内部的实现并非真正的原子操作,或者存在其他可能导致线程不安全的因素(如共享了非原子操作的全局变量等),那么它就不是线程安全的。原子操作:原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。原子操作一定具备原子性,是线程安全的。具有原子性的函数或者方法并发一个原子操作不一定具备线程安全性。原子性:事务具有原子性,在一个函数上面加上。
2024-08-05 21:30:21 372
原创 Spring Core——资源加载与访问(Resource)
Resource接口为所有资源类型提供了一个通用的抽象,使得无论资源来自文件系统、类路径还是网络,开发者都可以通过一致的方式进行访问。通过使用这些实现类,开发者可以轻松地从不同来源获取资源,而不必担心底层的实现细节。总之,Resource接口及其实现类为资源访问提供了一种高度抽象和简化的解决方案,是Spring框架中一个非常有用的功能。Spring中将所有的资源抽象成了Resource对象,对于不同的资源类型有着不同的实现类,它为访问底层资源提供了一个统一的抽象,从而使得代码可以独立于实际资源的类型。
2024-07-28 23:56:48 515
原创 Redis 关于内存碎片的解决方法
今天生产机报内存爆满异常被叫过去查看问题,通过各种排除最终定位到了Redis的内存碎片的问题,这篇博客将详细介绍Redis内存碎片问题并给出最佳实践解决此问题。
2024-07-18 21:53:17 1214
原创 映射器代理工厂
我们在使用Mybatis时,只需要写Mapper和Dao接口就行,使用的时候只需要调用Dao中的方法就能完成数据的增删改查。那么Dao中的方法是谁实现的呢?难道Mybatis自动帮我们写了一个Dao的实现类吗?非也!而是使用了映射器代理工厂来实现的。映射器代理工厂(Mapper Proxy Factory)在Mybatis框架中扮演着至关重要的角色。它是用来创建映射器接口的代理对象的工厂类,通过这个工厂类,可以实现对数据库操作的抽象和简化。
2024-07-14 12:55:14 500
原创 设计模式——多例模式(23种之外)
多例模式(Multiton Pattern)是一种特殊的设计模式,它属于创建型模式。与单例模式(Singleton Pattern)相比,多例模式允许一个类有多个实例,但是实例的数量是有限制的,并且这些实例在全局范围内是共享的。这种模式适用于当系统中有且仅有几个对象实例被频繁使用,且这些对象的创建和销毁开销较大时。在我的SpringBoot项目中遇到的一个问题,最后使用多例模式解决了。
2024-07-13 15:24:16 538
原创 RedisTemplate 中序列化方式辨析
在Spring Data Redis中,RedisTemplate 是操作Redis的核心类,它提供了丰富的API来与Redis进行交互。由于Redis是一个键值存储系统,它存储的是字节序列,因此在使用RedisTemplate时,需要指定键(Key)和值(Value)的序列化方式。不同的序列化方式适用于不同的场景。下面将详细介绍几种序列化方法。
2024-07-10 22:28:00 1277
原创 FactoryBean 原理简介
FactoryBean 首先是一个工厂类,它可以生产指定的Bean,特殊之处在于它可以向Spring容器中注册两个Bean,一个是它本身,一个是FactoryBean.getObject()方法返回值所代表的Bean。通过实现 FactoryBean 接口,你可以控制某个 Bean 的实例化过程,提供比默认机制更复杂的创建逻辑。
2024-07-03 23:32:00 867
原创 ImportBeanDefinitionRegistrar 简单原理
ImportBeanDefinitionRegistr动态地向Spring应用上下文中注册额外的。这使得开发者能够在配置阶段根据特定条件或者逻辑动态地添加 Bean,而不是静态地声明所有的 Bean。那么应用场景是什么呢?在SpringBoot中我们定义一个Bean,只需要在类上面注解@Component即可,然后容器就帮我们管理了一个默认的单例Bean。那么,它就是借助来完成的。总结就是,当需要我们根据条件(这个条件可以是判断特定的注解、可以是是否是某个接口的实现等)来注册Bean时,我们可以使用来实现。
2024-07-02 12:32:37 983
原创 BeanFactoryAware 机制简介
BeanFactoryAware 是 Spring 框架中的一个接口,它允许一个 bean 在其初始化时感知到其所在的 BeanFactory。这通常用于在 bean 内部进行一些高级配置或访问 Spring 容器中的其他 bean。
2024-07-01 14:23:25 951
原创 Netty篇章(1)—— 核心原理介绍
Netty是一个Java NIO客户端/服务器框架,是一个为了快速开发可维护的高性能、高可扩展的网络服务器和客户端程序而提供的异步事件驱动基础框架和工具。如果要开发一个网络通信模块,那么Netty是首选,知名的Dubbo、Zookeeper、RocketMQ 网络通信模块全都是Netty实现的,我发现阿里的分布式框架网络通信模块很喜欢使用Netty作为网络通信框架。Netty的目标之一,是使通信开发可以做到“快速和轻松”。
2024-01-22 18:09:44 1061
原创 Java-NIO篇章(5)——Reactor反应器模式
Reactor就是一种网络编程的设计模式,如果不知道Reactor那么学Netty的时候会非常困难,因为很多概念就是Reactor,因此学会了Reactor在学Netty就非常简单。其次,懂得高并发中间件的网络通信设计的底层原理对提升自己的技术也是非常重要的,所以,学习像Netty这样的“精品中的精品”框架,肯定也是需要先从设计模式入手的。而Netty的整体架构,就是基于这个著名反应器模式。
2024-01-21 20:29:37 1395
原创 不同线程之间如何传参?
假设在主线程中的某个对象需要传入到另外一个线程中进行处理,那么两个线程之间如何传递参数?例如:主程序中有个字符串,使用异步子线程进行空格拆分,结果应该输出hello和world。
2024-01-21 20:25:06 733
原创 设计模式篇章(4)——十一种行为型模式
这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务,这个与结构型模式有点像,结构型可以理解为静态的组合,例如将不同的组件拼起来成为一个更大的组件;而行为型更是一种动态或者具有某个动作触发的事件,具有一定行为的设计模式。现在不清楚没关系,学完23种设计模式再回头看就能理解了。行为型模式包括:模板方法模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式共11种。
2024-01-19 14:30:39 1302
原创 Java-NIO篇章(4)——Selector选择器详解
选择器的使命是完成IO的多路复用,其主要工作是通道的注册、监听、事件查询。一个通道代表一条连接通路,通过选择器可以同时监控多个通道的IO(输入输出)状况。选择器和通道的关系,是监控和被监控的关系。 选择器提供了独特的API方法,能够选出(select)所监控的通道已经发生了哪些IO事件,包括读写就绪的IO操作事件。 一般是一个单线程处理一个选择器,一个选择器可以监控很多通道。所以,通过选择器,一个单线程可以处理数百、数千、数万、甚至更多的通道。在极端情况下(数万个连接),只用一个线程就可以处理所有的通道。
2024-01-19 13:25:08 2043 1
原创 Java-NIO篇章(3)——Channel通道类详解
Java NIO中,一个socket连接使用一个Channel(通道)来表示。对应到不同的网络传输协议类型,在Java中都有不同的NIO Channel(通道) 相对应。其中最为重要的四种Channel(通道)实现: FileChannel、 SocketChannel、 ServerSocketChannel、 DatagramChannel。
2024-01-18 14:01:18 1687 1
原创 Java-NIO篇章(2)——Buffer缓冲区详解
Buffer类是一个抽象类,对应于Java的主要数据类型,在NIO中有8种缓冲区类,分别如下: ByteBuffer、 CharBuffer、 DoubleBuffer、 FloatBuffer、 IntBuffer、 LongBuffer、 ShortBuffer、MappedByteBuffer。 本文以它的子类ByteBuffer类为例子讲解。ByteBuffer子类就拥有一个byte[]类型的数组成员final byte[] hb,作为自己的读写缓冲区,数组的元素类型与Buffer子类的操作类型相
2024-01-17 19:17:17 1480
原创 Java-NIO 开篇(1)
高性能的Java通信,离不开Java NIO组件,现在主流的技术框架或中间件服务器,都使用了Java NIO组件,譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前, Java IO类库是阻塞式IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。 称“老的”阻塞式Java IO为OIO(Old IO)。总体上说, NIO弥补了原来面向流的OIO同步阻塞的不足。
2024-01-17 15:46:46 1317
原创 行为型设计模式——命令模式
将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理
2024-01-14 13:06:49 1256
原创 行为型设计模式——中介者模式
中介者模式主要是将关联关系由一个中介者类统一管理维护,一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。中介者模式又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
2024-01-14 12:23:59 1034
原创 行为型设计模式——备忘录模式
备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,很多软件都提供了撤销(Undo)操作,如 Word、记事本、Photoshop、IDEA等软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态;还有在 浏览器 中的后退键、数据库事务管理中的回滚操作、玩游戏时的中间结果存档功能、数据库与操作系统的备份操作、棋类游戏中的悔棋功能等都属于这类。
2024-01-13 22:49:49 1310
原创 行为型设计模式——观察者模式
观察者模式也不难,这个模式用大白话将就是若干个观察者类都订阅一个发布类(被观察者类),当发布者需要发表消息的时候,观察者都能够收到消息。定义:又被称为发布-订阅(`Publish/Subscribe`)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
2024-01-12 15:31:29 1037
原创 行为型设计模式——状态模式
状态模式是比较简单的设计模式,它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断(俗称屎山)。它将每个状态定义为一个类,而每个状态类有自己对应的方法,因此当需要根据状态执行逻辑代码时不需要写大量的if-else判断是哪个状态然后执行对应的逻辑,而只需要创建某个状态对象,直接调用它对应的方法即可。定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
2024-01-12 14:42:07 1241
原创 行为型设计模式——责任链模式
又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。用大白话讲,就是一个任务,有多个处理类可以进行处理,但是多个处理类只有一个处理类可以处理它,这需要根据这个任务类的本身情况决定,因此需要将这个任务按照处理类的顺序进行处理,我们只需要将这个任务丢给第一个处理类即可返回结果,因为它如果无法处理会自动转交给下一个更强的处理类,一直找到合适的处理类为止,否则返回null。
2024-01-11 20:00:21 1343
原创 行为型设计模式——策略模式
策略模式非常简单,只需要将策略或者某个算法定义成一个类,然后传给需要使用的对象即可。定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
2024-01-11 19:41:30 1067
原创 行为型设计模式——模板方法模式
在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如拿泡茶这件事来说,可以分为4个步骤,第一步洗茶具,第二步烧开水,第三步放入茶叶并根据不同的茶叶泡不同的时间,第四步品茶。以上的一二四步都是一样的,只有第三步不一样,因此可以将一二四步具体实现好,即模板方法。第三步则是用户自己需要实现的方法,即抽象方法。
2024-01-10 13:01:33 1192
原创 结构型设计模式——装饰器模式
装饰者模式指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。就好比一个姑娘化妆,化完妆之后其实还是本人,只不过是多了一些功能,变好看了。因此,初学者可以简单理解成,装饰者模式就是外界传入一个对象(可以是构造方法也可以是set方法传入对象),对这个对象进行一些次要功能增强,然后返回的还是这个对象。这一点和代理模式有点点像,这里先不做区分。我们先来看一个快餐店的例子。
2024-01-09 13:30:42 1206
原创 结构型设计模式——适配器模式
这个更加好理解,就是做适配功能的类,例如,现在手机没有了圆形耳机接口,只有Type-C接口,因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器(适配器),这就是所谓的适配器,将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
2024-01-09 13:03:10 1268
原创 结构型设计模式——桥接模式
如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系(参考案例:即视频文件格式对象成为操作系统类的一个成员变量)。“抽象部分”和“实现部分”可以以继承的方式独立扩展而互不影响(参考案例:操作系统和视频文件分别继承自己的父类),在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合(组合就是视频文件对象成为操作系统对象的一个成员变量或者讲属性),即系统需要对抽象化角色和实现化角色进行动态耦合。
2024-01-08 12:40:49 1186
原创 结构型设计模式——外观模式
外观(Facade)模式是“迪米特法则”的典型应用,还记得这个“迪米特法则”吗?如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。下图中的系统内部是很复杂的,左边这个系统对外的调用关系更是很乱的,内部的不堪直接暴露给观众。而使用外观模式,则可以设置一个门面或者叫做代理对象,统一由这个门面来对外提供简单的、整洁的调用接口。这就是外观模式!
2024-01-08 12:18:34 634
原创 设计模式篇章(3)——七种结构型模式
结构型设计模式主要思考的是如何将对象进行合理的布局来组成一个更大的功能体或者结构体,这个现在讲有点抽象,用大白话讲就是利用现有的对象进行组合或者配合,使得组合后的这个系统更加好。好是相对于不使用设计模式,按照自己的堆屎山的逻辑堆成一个冗余的系统。结构型模式包括:享元模式、外观模式、桥接模式、适配器模式、装饰模式、代理模式、组合模式七种设计模式。接下来,按照从易到难进行介绍!
2024-01-07 18:11:23 583
原创 结构型设计模式——享元模式
享元模式是结构型模式中最简单的一个模式,享是共享的意思,元是最小单元或细小的对象的意思。也就是说对一些需要大量重复使用的很细的对象进行缓存,缓存了就可以重复使用,例如Integer类中对整型-128到127进行了缓存,使用的正是享元模式。它有点类似单例模式,不过单例模式只共享一个类的唯一对象,而享元模式是共享多个类的唯一对象。给出定义如下:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似对象的开销,从而提高系统资源的利用率。
2024-01-07 18:01:18 1088
原创 设计模式篇章(2)——五种创建者模式
创建者模式主要思考如何创建一个对象,如何将对象的创建与使用分离。一般初级程序员都是new一个对象,然后紧接着使用这个对象,在某些场景中这样子是有问题的,需要使用创建者模式替代的(例如使用单例模式)。设计模式中提供了五种创建模型,分别是单例、原型、工厂方法、抽象工厂方法、创建者五种模式。
2024-01-05 14:29:30 915
原创 Java枚举类全网最易懂讲解
今天有个同学说他没怎么用过枚举类让我给他讲解一下,他说看了这么多博客还是一团雾水。然后我搜了一下,发现都是写的啥呀!我来,如果这篇博客你还听不懂请狂喷我,暴躁老哥立马上线写下此版本,废话少说,下面开始介绍。
2024-01-04 14:34:33 1046
原创 设计模式篇章(1)——理论基础
设计模式:在软件开发中会面临许多不断重复发生的问题,这些问题可能是代码冗余、反复修改旧代码、重写以前的代码、在旧代码上不断堆新的代码(俗称屎山)等难以扩展、不好维护的问题。因此1990年有四位大佬(GoF组合)合作出了一本书,叫做《设计模式:可复用面向对象软件的基础》,它比较完美地解决了在软件工程当中所遇到的上述问题,即给出了如果遇到上述问题的标准答案!
2024-01-03 20:43:08 574
原创 Java异步回调的实现
在Java中,异步回调是一种常见的编程模式,用于处理异步操作和事件驱动的场景。异步回调通常用于处理耗时的任务,以避免阻塞主线程,提高应用程序的性能和响应性。大白话来讲就是方法A调用方法B的一种实现过程,其中方法B是非常耗时的,异步回调机制就是让方法A调用方法B但不阻塞当前线程,且方法B执行完后会自动调用方法A的一个指定的方法(往往在这里就是将结果传回来处理)。
2023-12-26 16:01:22 517
原创 状态模式——状态转换的优化神器
状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态发生变化时改变其行为。状态模式的核心思想是将对象的状态封装成不同的类,并在对象内部维护一个指向当前状态的引用。这使得对象在不同状态下具有不同的行为,而且可以在运行时动态切换状态。其实这有点像策略模式,共同点都是是传入的状态|策略对象来驱动行为。下面给出例子并说明使用状态模式和不使用状态模式实现状态转换功能的区别。
2023-12-06 14:56:03 181
原创 异步任务线程池——最优雅的方式创建异步任务
对于刚刚从校园出来的菜鸡选手很容易写出自以为没问题的屎山代码,可是当上线后就会立即暴露出问题,这说到底还是基础不够扎实!只会背八股文,却不理解,面试头头是道,一旦落地就啥也不是。此处,抛出几个八股文:为什么要使用线程池?使用Executors的工厂类创建的线程池会有什么问题?阿里为什么推荐使用标准构造器创建线程池?使用线程池提交任务submit和execute有啥不一样吗?等等,如果以上的问题你回答不出,那么你距离一个中级软件工程师还有很大差距!我建议系统性学习一下,如果只是想知道答案可以访问我的相关博客。
2023-11-18 16:43:10 284
原创 try-with-resources(TWR)方式关闭流资源
使用传统的方式关闭流资源当然没问题,但是需要写的代码有点多,而是Java 7 之后的新语法糖,旨在减轻开发人员释放try块中使用的资源的压力。一时用TWR方式一时爽,一直用一直爽,但是有些情况也是不能使用这种方式的,但是绝大多数时候是可以使用的,下面进行详细的介绍。
2023-11-17 14:19:44 455
hello-spring-boot-starter
2023-06-24
cascade.xml
2020-03-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人