1.MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的工厂工厂最佳姿势)
2.[fastllm]fastllm源码结构解析
3.Spring源码-09-Bean工厂之getBean方法
4.6. Spring源码篇之FactoryBean
5.全面通透深入剖析工厂方法模式
6.beehive 源码阅读- go 语言的自动化机器
MASA Framework源码解读-01 MASAFacotry工厂设计(一个接口多个实现的最佳姿势)
闲来无事,偶然接触到了MASA Framework,源码源码此框架是模式MASA Stack系列中专门用于构建web系统的开源框架。通过在几个小型项目中的示例应用,我发现它确实拥有诸多优点。及解为深入理解其内部结构和设计思路,工厂工厂情感网站源码我决定详细阅读MASA Framework的源码源码源代码,并记录整个阅读过程。模式如有任何错误或疑问,示例还请各位指正。及解
MASA Framework是工厂工厂一个功能全面且易于扩展的框架,主要由三个部分组成:BuildingBlocks(抽象层)、源码源码Contrib(BuildingBlocks的模式实现)以及Utils(工具库)。官方将BuildingBlocks称为构建块,示例实际上,及解这个层将日常开发中频繁使用到的功能抽象出来,如多租户、多语言、仓储、配置中心等,形成易于替换的接口,大大提高了框架的灵活性和可扩展性。
MASA Framework包含个主要模块,几乎涵盖了日常开发所需的所有组件,从基础服务到高级功能应有尽有。这些模块协同工作,共同构建了一个强大且功能丰富的框架。
让我们从MASA Framework的核心设计——构建工厂(MasaFactory)开始探讨。构建工厂在框架中起着至关重要的作用,它负责通过配置选项来创建不同实现的实例。在实际项目中,构建工厂设计用于解决接口具有多种实现时的依赖注入问题,比如在面对多实现的超级外卖 源码场景时,如何优雅地注入并使用特定的实现类。以下是构建工厂解决多实现问题的具体步骤:
首先,通过下载MASA Framework的源码(地址:github.com/masastack/MA...)进行研究。我们首先关注的是Masa.BuildingBlocks.Data.Contracts类库的设计。MASA Framework的构建工厂通过选项配置,允许为接口的每个实现类指定一个简短的名称。根据传入的不同名称,构建工厂类的Create方法能够创建对应的实例。
通过使用MASA Framework的构建工厂,我们能够轻松地创建与特定名称对应的面单消息转换类,而无需依赖于IEnumerable集合进行复杂的筛选。这种方法在实现多实现场景时明显更加直观且高效。
以物流面单申请为例,不同销售订单对应不同的商家店铺,而每个商家店铺可能选择不同的物流商。利用MASA Framework构建工厂实现不同物流商的面单申请,不仅简化了开发过程,而且在使用层面保持了无感的效果。
总结而言,MASA Framework提供了强大的构建工厂设计,以解决多实现接口的依赖注入问题,简化了开发流程。这个设计不仅限于构建工厂模块,其他模块同样采用了类似的设计理念,允许用户根据需要替换官方实现或结合自定义实现,以适应不同场景和需求。
MASA Framework的其他模块同样采用了构建工厂的设计,用户既可以替换官方实现,也可以在程序内同时共存官方实现和自定义实现。例如,Service Caller模块不仅支持使用dapr的服务调用,还提供了HTTP服务调用等选项。金蝶 erp 源码
[fastllm]fastllm源码结构解析
fastllm源码结构解析 主要文件结构和继承关系如下: main包含factoryllm工厂,用于生成各种llm模型实例,basellm作为基类,包含通用方法和参数,所有模型使用相同的命名空间,fastllm为基本类,定义数据格式、权重映射和基础算子操作。 fastllm类属性解析:SetThreads(int t): 设置线程数
SetLowMemMode(bool m): 设置低内存模式
LowBitConfig: 包含量化参数,提供量化与反量化方法
DataType: 包括浮点、int8、int4等数据类型
DataDevice: 包含CPU与CUDA
WeightType: 包括LINEAR、EMBEDDING和None
Data: 包括形状、大小、扩容信息,量化配置等,提供复制、分配、预扩容等功能
Tokenizer: 包含TrieNode链表和token-to-string字典,提供插入、编码和解码函数
WeightMap: 存储模型名称与数据内存,支持从文件加载和保存低位量化权重
core类操作分析:Embedding: 根据输入与权重计算输出
RMSNorm: L2归一化后乘以权重
LayerNorm: 使用gamma、beta进行层归一化
Linear: 线性变换
Split: 按轴分割数据
Cat: 按轴拼接数据
MatMulTransB: 多线程下矩阵转置乘法
Softmax: 激活函数
Silu: SiLU激活函数
GeluNew: 新型Gelu激活函数
Mul: 矩阵与浮点数乘法
MulTo: 点乘
AddTo: 点加操作(带alpha和不带alpha)
AttentionMask: 根据mask值替换
Permute: 数据通道转换
ToDevice: 数据迁移至GPU
basellm作为抽象类,继承自fastllm,包含纯虚函数如加载权重、模型推理、保存低比特模型、热身等。 chatglm、moss和vicuna继承自basellm,实现具体模型,函数与basellm类似。过362源码 fastllm结构体与属性解析:FileBuffer: 文件读写操作,包括读取各种类型数据和文件写操作
Data操作: 包括数据拷贝、统计、扩容、转置、计算权重和等
Tokenizer方法: 包括初始化、清空、插入、编码和解码
WeightMap方法: 包括从文件加载和保存低位量化权重
fastllm方法: 包括矩阵转置、通道转换、数据迁移、多线程乘法、激活函数等
Spring源码--Bean工厂之getBean方法
Bean实例化与管理是Spring框架的核心功能之一,其中getBean方法作为获取Bean实例的主要手段,具有重要意义。接下来,我们将深入探讨getBean方法及其相关实现,以期更好地理解Spring Bean工厂的工作机制。
一、getBean方法
getBean方法是Spring容器对外提供的一种接口,用于根据指定的Bean名称获取对应Bean实例。该方法会根据配置信息和缓存机制,找到并返回所需的Bean。
二、doGetBean方法
doGetBean方法是getBean方法的内部实现,负责处理Bean的查找、创建和返回工作。其流程分为以下几个关键步骤:
1. getSingleton
若Bean是单例且已存在,则直接返回缓存的实例,无需重新创建。
2. createBean
若非单例或未找到缓存实例,将进入创建Bean的libvpx 源码下载流程。此过程涉及实例化、属性填充和初始化三个主要步骤。
2.1 实例化
通过调用对应的构造函数或使用默认构造函数创建Bean实例。
2.2 三级缓存
在实例化后,新创建的Bean会首先存储于缓存中,随后被添加到Bean作用域的缓存中,以备后续使用。
2.3 属性填充
通过依赖注入或属性设置方法填充Bean的属性值,确保其具有所需的功能。
2.4 初始化
执行Bean的初始化方法,实现任何特定的初始化逻辑,如配置文件加载或数据库连接等。
三、流程图
为了更直观地展示getBean方法的执行流程,以下流程图详细展示了从查找至返回Bean实例的全过程,包括缓存操作、实例化、属性填充和初始化等关键步骤。
四、循环依赖示意图
在处理循环依赖时,Spring容器会采取特定策略以避免无限循环。以下示意图展示了两个单例Bean(A和B)之间循环依赖的处理过程,以及Spring如何通过延迟初始化等机制解决这一问题。
本文通过深入剖析getBean方法及其相关实现,旨在帮助开发者更好地理解Spring Bean工厂的工作机制。通过掌握这些关键概念与流程,可以更高效地利用Spring框架构建可维护且高性能的应用程序。
6. Spring源码篇之FactoryBean
FactoryBean是Spring提供的一个功能强大的小型工厂,用于灵活创建所需Bean。在框架与Spring整合时,尤其是Mybatis-plus中,通过注解可以自动生成Spring Bean,而FactoryBean的功能正是实现批量动态生成Bean。下面详细介绍FactoryBean的源码解析。
首先,我们来看看如何判断一个对象是否为FactoryBean。在Spring的实例化过程中,如果类实现了FactoryBean接口,则会被识别为FactoryBean。而获取FactoryBean时,通常在Bean名称前加上"&"符号。
接下来,我们深入分析FactoryBean的接口。
FactoryBean接口定义了如何创建Bean,包含两个主要方法:getObject和isInstance。getObject用于返回创建的Bean实例,isInstance用于判断一个对象是否由FactoryBean创建。
SmartFactoryBean是FactoryBean的子接口,它提供了额外的特性,允许决定是否提前实例化对象。
在实际使用中,FactoryBean的实例化过程较为关键。如果不希望立即实例化某个非懒加载单例Bean,则需要确保它未被识别为FactoryBean。例如,UserBean的实例化代码在正常情况下不会打印任何输出,表明并未实例化。而通过将UserBean实现为SmartFactoryBean,并使isEagerInit返回true,就能在控制台中观察到UserBean的实例化过程。
获取FactoryBean创建的Bean有多种方式。通过在Bean名称前加"&",可以获取到由getObject方法生成的Bean。此外,若需要获取FactoryBean本身,则可以使用多个"&"符号,Spring会循环遍历,直至获取到实际的Bean。
在Spring实例化完成后,通常会调用getObjectForBeanInstance方法来获取真正的Bean实例。这一过程包括了共享实例(sharedInstance)的引用和Bean名称的处理。最终,通过调用getObject方法,我们能够获取到由FactoryBean生成的实际Bean。
以Mybatis-plus中的MapperFactoryBean为例,说明了如何在实际项目中应用FactoryBean。MapperFactoryBean是Mybatis-plus提供的一个FactoryBean,用于自动注册Mapper接口为Spring Bean。
总结而言,FactoryBean在Spring中扮演着灵活创建和管理Bean的重要角色,尤其在需要动态生成或自定义Bean创建逻辑的场景中。通过理解其源码和使用方法,开发者可以更高效地整合各类框架与Spring,实现更为灵活和高效的系统构建。
全面通透深入剖析工厂方法模式
全面解析工厂方法模式: 工厂方法模式适用于以下场景:当需要大量重复代码来创建对象时,可以使用此模式简化代码。
客户端无需了解产品类的具体实现细节,保持了灵活性。
当一个类通过其子类指定创建哪种产品时,可以避免硬编码。
工厂方法模式的UML类图展示了一个清晰的结构,包括抽象工厂(Factory)、具体工厂(Concrete Factory)、抽象产品(Product)和具体产品(Concrete Product)四个角色。抽象工厂是核心接口,具体工厂负责产品创建,抽象产品定义共同特性,具体产品实现这些特性。 通用的工厂方法模式实现如下:首先定义一个ICourseFactory接口,然后根据具体需求创建子类工厂,如JavaCourseFactory和PythonCourseFactory,客户端通过这些工厂创建所需课程实例。这种方法有助于产品扩展和维护。 在Logback源码中,工厂方法模式的应用体现在分离不同工厂创建不同日志框架,保持代码组织和模块化。同样,Logger产品体系也遵循此模式,通过工厂创建特定的日志框架实例。 想深入了解工厂方法模式在实际中的应用,可以关注微信公众号『 Tom弹架构 』并回复“设计模式”获取更多实例和源码。技术分享是进步的桥梁,如果您觉得本文有价值,请关注、点赞,您的支持是我们继续创作的动力。更多技术内容,尽在『 Tom弹架构 』公众号。beehive 源码阅读- go 语言的自动化机器
beehive源码深入解析:Go语言中的自动化机器设计
beehive的核心模块系统在包<p>bees</p>中体现其独特的解耦设计,这使得系统操作简便且易于扩展。只需要少量的学习,就能扩展自己的beehive功能。这里的"bee"代表Worker,执行具体任务,类似于采蜜的工蜂;而"hive"则是一个WorkerPool的工厂,通过简单配置(如一个token)即可创建针对特定任务的bee。
"chain"是连接事件和处理的关键,它将事件(如博客更新)与响应(如发送邮件)关联起来,通过事件通道(eventChan)触发并执行相应的action。WebBee的实现展示了如何在Run方法中接收事件并唤醒相应的bee,同时ServeHTTP函数负责http请求处理,暴露API供外部调用。
事件(Event)的处理通过<p>handleEvents</p>函数实现,它接收事件并将事件与对应的bee关联,进一步通过chains链接Event和Action,实现bee间的协作。Action的执行由<p>execAction</p>函数负责,可以处理预设选项或运行时传入的选项。
总的来说,beehive的自动化机器设计通过巧妙的解耦、事件驱动和灵活的链式处理,提供了一种高效且可扩展的编程模式。
Spring源码. 注册bean处理器registerBeanPostProcessors()
在刷新bean工厂时,registerBeanPostProcessors()方法扮演关键角色。此方法位于刷新过程的第六步。首先,根据类型扫描工厂中所有实现了BeanPostProcessor接口的类,记录这些处理器的数量。接着,创建集合存储符合条件的处理器。根据处理器是否实现了PriorityOrdered、Ordered或未实现这两种接口,将它们分别放入到不同的集合中。对于实现了PriorityOrdered的处理器,将其添加到priorityOrderedPostProcessors集合中。处理实现了Ordered接口的处理器,以及未实现这两种接口的处理器。每个大步骤包含三小步:将符合条件的处理器放入相应的集合,不符合条件的处理器再次检查是否实现MergedBeanDefinitionPostProcessor,符合则放入internalPostProcessors集合中。对放入的处理器进行排序,并最终注册到工厂中。最后一步,注册ApplicationListenerDetector到工厂中。至此,registerBeanPostProcessors()完成了对bean处理器的注册与排序,确保了bean工厂的正确初始化。
unique_ptr源代码解析
unique_ptr的特征包括:
std::unique_ptr是一种小巧、高速的智能指针,拥有对托管资源的专属所有权语义。默认采用delete运算符进行资源析构,也可指定自定义删除器。状态或函数指针实现的删除器会增加对象尺寸。
unique_ptr常见用途是工厂函数,以及实现Pimpl设计模式。
源码解析:
深入理解unique_ptr可通过研究其源代码。关键在于只移型别和所有权管理,无需死记硬背。
先看__uniq_ptr_impl源代码。
接下来分析构造函数和析构函数。
unique_ptr重要成员方法讲解。
为unique_ptr对象设定自定义析构器需通过构造函数,而非C++的make_unique函数。验证结果如下。
unique_ptr不支持使用raw pointer作为赋值初值。
不能进行普通的拷贝或赋值操作。