自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 资源 (10)
  • 收藏
  • 关注

原创 Spring源码笔记之SpringIOC--(5)BeanFactory的扩展之ListableBeanFactory

设计只提供了获取单个Bean的能力,为了额外提供获取所有bean(List Beans)的能力,定义了。中获取所有bean的操作会不会去父容器parentBeanFactory中搜索呢?都需要提供遍历bean的能力,但是这是一个比较常用的能力。在spring中我们可能会有获取所有bean的需求,但是。BeanFactory扩展,提供获取所有Bean的能力。BeanFactory扩展,提供访问父容器的功能。BeanFactory扩展,提供自动注入的能力。工具类实现递归搜索父容器所有bean的诉求。

2024-02-20 08:00:00 1009

原创 Spring源码笔记之SpringIOC--(4)BeanFactory的扩展之HierarchicalBeanFactory

在实际使用过程会通过引用父容器parent实现BeanFactory的嵌套调用,如下。BeanFactory扩展,提供获取所有Bean的能力。提供配置、分析和修改bean定义,以及预实例化单例能力。先引用BeanFactory的类继承关系图来看一下。BeanFactory扩展,提供访问父容器的功能。BeanFactory扩展,提供自动注入的能力。Spring默认的BeanFactory实现。提供配置BeanFactory的能力。分层功能的扩展,它提供了。这种关系有点类似与单链表。

2024-02-19 08:00:00 831

原创 Spring源码笔记之SpringIOC--(3)什么是BeanFactory?

是SpringIOC的最顶层接口,涵盖了IOC容器最基本的操作。提供了IOC容器获取所有Bean、配置Bean的额外能力。所有的实现类持有所有Bean的定义,用一个唯一的字符串(即Bean的名字)区分。提供单例Bean(singleton scope)与多例Bean的能力(prototype scope),自从Spring2.0后Bean的作用范围不单单局限于单例与多例,还具有提供请求(request)与对话(session)级别的范围。是IOC容器注册Bean的入口,也是Bean配置中心。

2024-02-18 08:00:00 820

原创 Spring源码笔记之SpringIOC--(2)从BeanDefinition到Bean实例

BeanFactory扩展,提供获取所有Bean的能力。提供配置、分析和修改bean定义,以及预实例化单例能力。)提供了获取bean实例的方法。BeanFactory扩展,提供访问父容器的功能。BeanFactory扩展,提供自动注入的能力。Spring默认的BeanFactory实现。注册BeanDefinition接口。提供配置BeanFactory的能力。

2024-02-17 23:06:24 1308

原创 Spring源码笔记之SpringIOC--(1)从XML文件到Bean的描述对象BeanDefinition

会被递归调用,BeanDefinitionParserDelegate是类内的对象,所以为了保证递归调用时类内能够使用正确的Delegate,此处。的set中,如果能add说明Resource未被加载,等加载完成后再remove,避免重复加载相同的Resource。最开始学习spring的入门实践是,编写一个xml文件,然后利用spring读取xml文件中配置的bean。的注册过程,但是实际使用IOC过程中,并不是直接使用。编写代码加载这个bean,并获取bean的实例。具体bean的加载实现在。

2024-02-17 22:58:57 723

原创 Kubernetes入门笔记 ——(3)理解pod对象

一个有A、B两个容器的pod,如果使用docker拉起,那AB会存在依赖关系,如A先启动,B共享A的Volume等资源。Infra容器必须占用足够小的资源,它使用k8s.gcr.io/pause的特殊镜像,是一个由汇编语言编写、永远处于暂停状态的容器,只有100-200KB。所以对于Linux进程组中每一个进程,k8s中都需要一个单独的容器,这些容器需要互相依赖紧密合作,pod的概念就应运而生。容器和pod是什么关系?pod只是逻辑的概念,pod内的容器共享了某些资源,k8s引入pod目的是容器设计模式。

2023-12-09 17:42:00 588

原创 Kubernetes入门笔记——(2)k8s设计文档

​k8s最初源自谷歌的Brog项目,架构与其类似,主要包括etcd、api server、controller manager、scheduler、kubelet和kube-proxy等组件。: 负责资源的调度, 按照预定的调度策略将 Pod 调度到相应的机器上;:负责维护容器的生命周期,也负责磁盘(CVI)和网络(CNI)的管理。api server里又有认证、鉴权、REST接口、调度触发等模块。:负责维护集群的状态,比如故障检测,自动扩展、滚动更新等。:资源操作的唯一入口,并提供认证、鉴权等功能。

2023-12-06 23:55:24 900

原创 Kubernetes入门笔记——(1)Kubernetes是什么

容器比docker是一个更大的概念,一开始Google工程师便使用Linux的Namespace技术,将多个应用安装在一台服务器上并相互隔离。这样一个docker容器只能“看到”自己的进程,且网络、存储、计算等资源都是被隔离和限制的,类似于运行在一个沙箱中。Kubernetes是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、扩缩容、运维等功能。k8s集群提供了多个容器的编排、扩展、资源管理、运维等一系列功能,基于容器的部署更为方便,可靠性更高,是一个强大的容器管理框架。

2023-12-06 22:44:55 566

原创 日志框架LOG4J2系列六——log4j2使用包装器

slf4j+log4j2组合使用时,有时会使用包装器LoggerWrapper(装饰器LoggerDecorator)对原生的Logger能力进行增强,如修改日志的入参或对日志增加一些定位信息。,并在打印位置时使用它在每个日志事件中堆栈进行遍历,打印全限定类名(FQCN)的上一个堆栈的行号。没有指定FQCN,导致Log4j2认为FQCN是其内部的Logger,他的上一层日志事件是。期望日志为打印业务日志的类名与行号,使用log4j2的。发现log4j2打印的行号错误,都打印相同的行号,且是。

2023-11-02 12:07:09 468

原创 MapStruct使用指南(二)——MapStruct数据类型转换

如果Mapstruct有些场景不能完成,可以自定义转化方法// 自定义方法实现 static PersonDto toPersonDto(Person person) {} }也可以使用@Mapping的表达式属性expression显式指定某一个参数。注意expression不会自动导入,所以表达式中要使用其他类的方法,要带全类名(包名.类名.函数名)或者使用@Mapper的imports显式导入所需要的类。

2023-07-05 23:46:51 12002

原创 MySQL学习笔记(2)——MySQL的锁

1、MySQL索引的类型主要有哪些?B-Tree索引、哈希索引、空间数据索引(R-Tree)、全文索引、其他索引(聚簇索引、覆盖索引等)。2、常见存储引擎与其支持的索引?B-Tree索引:InnoDB,MyISAM,NDB(大部分存储引擎都支持)哈希索引: Memory空间数据索引:mysql功能并不完善, PostgreSQL数据库PostGIS较好全文索引:MyISAM聚簇索引: InnoDB覆盖索引:InnoDBB-TREE索引如何理解?...

2022-03-27 23:38:58 479

原创 MySQL学习笔记(1)——MySQL的并发、事务与MVCC

基本知识一、MySQL的并发、事务与MVCC1.1 MySQL的架构1.2 并发控制1.2.1 读写锁1.2.2 锁粒度1.3 事务1.3.1 事务的四个特性ACID1.3.2 死锁1.3.3 事务日志1.3.4 隔离级别产生的问题1.3.4.1 三种因隔离级别产生的问题1.3.4.2 事务的四种隔离级别1.3.4.3 修改事务的隔离级别1.3.5 事务的自动提交1.3.6 事务型表与非事务型表1.3.7 InnoDB隐式与显式锁定1.4 多版本并发控制(MVCC)1.4.1MVCC的特性1.4.2 Inn

2022-01-09 16:04:38 1123

原创 设计模式(9)——创建型模式之工厂方法

工厂方法是一种创建型设计模式,通过在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。该模式的结构包括产品接口、具体产品、创建者类和具体创建者。工厂方法的核心思想是将对象的创建过程延迟到子类中,从而避免客户代码与具体产品类之间的耦合。适用场景包括无法预知对象确切类别及其依赖关系时。通过工厂方法,可以在不同操作系统或环境中生成特定类型的对象,而无需重写大量代码。例如,在跨平台UI开发中,工厂方法可以根据操作系统生成不同样式的按钮,同时保持对话框逻辑的一致性。这种设计模式提高了代码的灵活性和可扩展性。

2025-05-14 23:03:49 814

原创 设计模式(8)——SOLID原则之依赖倒置原则

在本例中,高层次的预算报告类(BudgetReport)使用低层次的数据库类(MySQLDatabase)来读取和保存其数据。这意味着低层次类中的任何改变(例如当数据库服务器发布新版本时)都可能会影响到高层次的类,但高层次的类不应关注数据存储的细节。一部分人直观认为如果低层次的类没有实现或不确定,就无法确定高层次类能实现哪些东西。要解决这个问题,你可以创建一个描述读写操作的高层接口,并让报告类使用该接口代替低层次的类。其结果是原始的依赖关系被倒置:现在低层次的类依赖于高层次的抽象。

2025-04-13 22:19:37 596

原创 设计模式(7)——SOLID原则之接口隔离原则

客户端不应被强迫依赖于其不使用的方法。这句话的意思是指尽量缩小接口的范围,使得客户端的类不必实现其不需要的行为。根据接口隔离原则,你必须将“臃肿”的方法拆分为多个颗粒度更小的具体方法。客户端必须仅实现其实际需要的方法。否则,对于“臃肿”接口的修改可能会导致程序出错,即使客户端根本没有使用修改后的方法。阿里云,华为云等云服务厂商都有自己不同的sdk实现,当同时使用多家云服务厂商时,就需要分别调用不同的sdk。假如我们现在想要封装出一套云服务厂商通用接口,可以定义接口,不同的云厂商分别实现即可。但是接口定义的

2025-03-05 22:10:54 575

原创 【Mysql常见问题】MySQL Error #1071 - Specified key was too long; max key length is 767 bytes

如果列值长度 > 768字节,那么前768字节依然在数据页,而剩余的则放在溢出页(off-page)。对于InnoDB来说,内存是极为珍贵的,如果把768字节长度的blob都放在数据页,虽然可以节省部分IO,但相对来说能缓存行数就变少,也就是能缓存的索引值变少了,降低了索引效率。在long blob列类型比较多的情况下用,可以降低off-page的使用,减少存储空间(一般40%左右),但要求更高的CPU,buffer pool里面可能会同时存储数据的压缩版和非压缩版,所以也多占用部分内存。

2025-01-17 22:45:50 1123

原创 领域驱动设计(4)—绑定模型与实现

分析模型仅仅是理解工具,分析中也有一些知识消化的过程,但编码后,程序设计人员不得不重新进行抽象,这会导致领域知识丢失。用户会奇怪文件名是指什么。人们经常说技术水平较高的架构师负责设计,技术水平相对低的开发人员负责实现代码,这是错误的,因为软件开发就是设计。很多项目设计之初只考虑到模型如何设计,没有将模型如何实现、数据关系如何存储这些实现考虑在内,往往设计“很完美”的模型交给开发人员却无法落地。虽然项目初期设计了领域模型,但是模型没有与实现绑定,不能帮助开发可运行的软件,这种纸上谈兵的模型是没有意义的。

2025-01-04 22:10:52 675

原创 领域驱动设计—(3)交流与语言的使用

这时候可以先根据现有的知识形成初步的模型,后期通过对领域的逐步加深,逐渐细化设计后,要对原先不合理的模块、类进行必要的重构,使得模型与实现一致。团队内从需求描述、功能设计分解、验收用例设计等等都应使用通用语言交流,同一领域的相同词汇不应该反映不同的模型。使用UML图(主要是类图和对象图)进行软件设计讨论,此时的图应该着重表述模型的重要概念,可以选择性的忽略细节。对话是改善建模的最佳方式之一,试着大声说出模型变化的各种结构,这样不完善的地方很容被听出来。灵活的、知识丰富的设计需要一种通用的、共享的语言。

2025-01-04 08:40:07 381

原创 git环境配置用户与秘钥

以gitee为例,使用git配置用户、邮箱与秘钥

2025-01-01 21:03:47 645

原创 领域驱动设计—(2)消化知识

这一步在目前公司内推行还是有一定压力的,通常团队各个人员各为己战,产品只觉得把产品规划做好就行了,实现是开发人员的事情。而且,对设计所花的时间在整个开发过程中是相对较短的。所以这需要一些好的沟通方式或者沟通技巧,比如可以设计一个初步模型,有些备选方案,然后组织团队成员去讨论,提高效率。优秀的码农会自然而然的开发出一个具有可扩展的抽象模型,在团队成员一起消化理解模型的过程中,他们的交互也会发生变化。建立领域模型是团队成员将现实利用通用语言描绘的过程,有点类似于消化现实中的知识,转化为一种通用语言的模型。

2024-12-30 08:35:21 413

原创 领域驱动设计—(1)运用领域模型

现实中软件遇到的一些复杂性问题,人们更习惯通过使用一些技巧、框架去解决,而不会过多思考软件设计层面的问题。这其实把软件设计问题抛给了第三方框架去解决,或者只是规避了问题,很难去下手做出根本改变。**领域模型:**用于描述应用软件涉及领域的通用语言。领域驱动设计已经形成了一套软件设计的科学方法论,在软件开发活动中灵活运用才是事半功倍的方法。**领域:**应用软件的问题区域,如会计程序的金融领域,票务预订程序的乘客、余票等。其实软件遇到的复杂性问题很多是设计、架构不合理导致的。

2024-12-26 08:49:19 307

原创 线程池使用不当导致线程死锁

这时候已经提交到线程池的线程要等待队列中的任务运行,而队列中的任务又需要线程池中线程运行完成,释放后才能执行,最终导致线程池死锁。到线程池中,已经占满了它的线程池,后续我们又把每个tree的子节点提交到线程池中处理,此时会加入到线程池的等待队列中,而且必须要等到子节点处理完成后才返回(对应。在项目开发中,为了支持并发场景,减少资源开销,通常会使用公共线程池,即预先创建一个线程池,需要并发时都将任务提交该线程池中。然后我们思考处理逻辑,我们可以深度优先搜索遍历这个二叉树,然后返回叶子节点与根节点的最大值,

2024-12-24 22:28:12 842

原创 java中double强制转换int引发的OOM问题

这里step为0,Math.floor(total / step) = Infinity,强制转为int后得到值为2147483647。Not-a-Number,非数字值,数学上0/0是无意义的,java在浮点运算中实现了NaN,定义为0.0/0.0。怀疑num过大导致,查看入参total为合理值,但是step是取配置值,配置未配置时默认为0,则问题代码为。根据单步步长step将total值划分后,然后进行处理。无限,分为正无限与负限小,定义为一个非0数字除以0。最近出现了一次OOM问题,问题代码如下。

2024-10-23 09:02:53 828

原创 Docker实战-第一章欢迎来到Docker世界

docker是包括一个命令行程序、后台守护进程和一组远程服务,它简化了安装、运行、发布和删除软件的工作。docker实现的基础是UNIX的容器技术。所以在docker出世之前已经有容器的概念,而且像谷歌一类公司也在探索自己的容器,docker将容器技术提供了更为简便的容器实现。容器是指隔离应用程序与外部资源的运行环境。最开始使用容器仍需要手动配置,非常容易出错。docker基于现有容器引擎,根据最佳实践提供了一致的docker构建方案。

2023-09-19 08:52:04 425

原创 Java反射获取所有Controller和RestController类的方法

每个http请求基本都会使用@RequestMapping注解。

2023-08-14 22:34:44 782

原创 SpringFramework源码分析(一)——源码下载与编译

如果Mapstruct有些场景不能完成,可以自定义转化方法// 自定义方法实现 static PersonDto toPersonDto(Person person) {} }也可以使用@Mapping的表达式属性expression显式指定某一个参数。注意expression不会自动导入,所以表达式中要使用其他类的方法,要带全类名(包名.类名.函数名)或者使用@Mapper的imports显式导入所需要的类。

2023-07-13 13:00:57 768

原创 MapStruct使用指南(一)——MapStruct引入与lombox配合使用

MapStruct是一个开源的基于Java的代码生成器,用于创建实现Java Bean之间转换的扩展映射器。在DDD多模型之间的转换有重要作用

2023-07-04 20:35:38 1314

原创 Java获取当前的UTC时间

Instant获取的是格林威治标准时间(UTC时间)。因为Instant是表示时间戳的对象,它不依赖于时区信息。但是在显示Instant对象时,需要将其转换为特定时区的本地时间。但是此修改可能是全局性的,建议在代码启动之初设定全部使用同一时区时间,后面就不再频繁更改,避免产生时间错乱问题。java中如何获取utc时间,并转为Date对象,这是一个常见的问题。获取了UTC的毫秒时间,然后new一个Date对象。那么为什么不能获取,如何正确获取utc时间呢?时打印的是带时区的时间,而非UTC时间。

2023-03-22 00:32:00 5540

原创 Markdowm使用mermaid

介绍Markdowm如何使用mermaid,包括图(graph)、UML类图(classDiagram)、时序图(sequenceDiagram)等

2023-03-04 23:24:41 1593

原创 Java读取文件为字符串方法

【代码】Java读取文件为字符串方法。

2023-02-20 00:28:02 4877

原创 Linux主机熵值不足导致SecureRandom线程阻塞问题

Linux主机熵值不足导致SecureRandom线程阻塞问题linux操作系统熵值不够,导致使用安全随机数时,长时间线程阻塞。问题定位使用jdk远程debug,发现线程堆栈停在SecureRandom.nextBytes()上,出现阻塞状态。表现为程序长时间无法向下运行。问题根因jre的安全随机数会使用linux的随机数生成器(在linux上实际上使用的是/dev/random或者/dev/urandom)来生成安全随机数,即提供永不为空的随机字节数据流。默认会使用阻塞算法获取随机数,如果熵值不

2022-10-11 23:36:26 4010

原创 SpringBoot系列——SpringBoot整合mybatis+Druid

2.1.2 Springboot配置文件mybatis-config.xml2.2 SpringBoot整合Mybatis+Druid2.2.1 pom依赖2.2.2 Springboot配置文件2.2.3 启动工程访问druid监控使用上面配置的与用户密码,访问例如创建一个job表,根据job_id查询job_status2.2.4.2 PO对象2.2.4.3 dao层接口与Mapper文件JobDao.javaJobMapper.xml2.2.4.4 修改MAVEN编译打

2022-08-15 23:59:40 1071

原创 解决mybatis报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

解决mybatis报错org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):检查mapper.xml文件是否在工程中生效检查dao层接口定义是否正确检查xml中mapper标签的namespace配置是否正确检查xml中语句配置是否正确1. 检查mapper.xml文件是否在工程中生效Mybatis的mapper.xml文件生效是由mapperLocations加载的SqlSessio

2022-07-21 17:26:19 927

原创 Java如何优雅地实现数组集合的相互转换

【问题】将转为一维int型数组【方法】使用 + String一维数组转int二维数组(String[] to int[][])【问题】将转为二维int型数组【方法】使用List转Map【问题】将一个List对象转为Map,其中List是类似如下结构:【方法】 +...

2022-07-17 22:11:01 766

原创 Java如何优雅地合并多个List

有时候我们会遇到:如何将的所有值合并为一个对象,这时候就可以使用。示例如下:输出为:Stream.flatMap()方法官网解释:上述解释可能比较难理解,这里更通俗的解释是,flatMap对流中的元素使用映射函数后再平铺一个流进行返回。所以可以理解上述用例代码,返回的是一个所有元素都为的流,再使用,将每个中的所有元素变为一个流,这样原本由3个List,每个List5个元素的流, 变成了15个String元素的流,然后再合并可以转为一个List。...

2022-07-06 23:21:09 3532

原创 Spring-Kafka系列(3)—— SpringKafka消费者监听MessageListener

之前已经介绍了通过和工具来消费数据。下面介绍SpringKafka消费数据的方式——kafka消息监听器。Kafka的消息监听一般可以分为:1.单条数据监听;2.批量数据监听。是的消息监听器接口,也是一个函数式接口,利用接口的方法可以实现消费数据。基于此接口可以实现单条数据消息监听器接口、多条数据消息监听器接口、带ACK机制的消息监听器和MessageListenerGenericMessageListener单条数据监听器BatchMessageListener批量数据监听器AckowledgingMe

2022-06-23 19:33:24 6799

原创 Spring-Kafka系列(2)——SpringKafka生产者KafkaTemplate

SpringBoot为Kafka提供了两种配置方式SpringBoot提供了配置类,且会将开头的配置项值注入的配置类中在使用Kafka配置项时只需要将其注入即可在spring的配置文件中配置如下:2.2 SpringKafka生产者KafkaTemplate2.2.1 创建一个生产者KafkaTemplate创建流程:application.ymlKafkapropertiesProducerFactoryKafkaTemplate2.2.2 KafkaTemplate发送消息方法Kafka

2022-06-20 12:39:03 7589 2

原创 SpringKafka无法提交offset问题:Group coordinator not available

SpringKafka无法提交offset问题:Group coordinator not available在使用SpringKafka时,无法提交offset,提交时报错:2022-05-28 17:24:32.078 INFO 14584 --- [umer_numb-0-C-1] o.a.k.c.c.internals.AbstractCoordinator : [Consumer clientId=consumer-consumer_numb-1, groupId=consumer_num

2022-05-28 18:15:17 4772

原创 Spring-Kafka系列(1)——Kafka集群部署与常用命令

一、Kafka集群部署1.1 部署ZookeeperKafka依赖zookeeper对Kafka服务器broker进行监控,所以需要先部署zookeeper,部署可见https://blog.csdn.net/Numb_ZL/article/details/123168037?spm=1001.2014.3001.55021.2 Kafka基本参数介绍参数含义broker.id=0类似于zookeeper的myidlog.dirs=/home/kafka/logs指定

2022-05-19 22:04:39 1418

转载 约瑟夫问题

约瑟夫问题II现有n个人围坐一圈,顺时针给大家编号,第一个人编号为1,然后顺时针开始报数。第一轮依次报1,2,1,2…没报1的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3…没报1的人都出局。以此类推直到剩下以后一个人。现给定一个int n,要求返回最后一个人的编号。题解解题思路,模仿约瑟夫环问题假设n=30, 每次跳跃距离为m, 初始为m=2第一次筛选后剩下为 [29, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 2

2022-05-08 21:34:49 747

基于STM32F4系列的4个编码器4倍频的转速解析程序

基于STM32F4系列的4编码器4倍频转速解析程序,程序有效,需要根据自己的配置更改有问题欢迎提问。

2019-01-03

ROS机器人底层嵌入式程序STM32

ROS机器人底层嵌入式程序STM32ROS机器人底层嵌入式程序STM32

2018-04-12

基于STM32F4的霍尔编码器解析程序

基于STM32F4的霍尔编码器解析程序,可以做辨向和解析速度

2018-04-12

STM32F4开发指南-库函数版本_V1.1

STM32F4开发指南-库函数版本_V1.1(完整版)十分清晰可以下载

2018-04-10

C++程序设计教程(王珊珊)

C++程序设计教程(王珊珊)C++程序设计教程(王珊珊)

2018-04-10

ROS机器人程序设计

ROS机器人程序设计ROS机器人程序设计ROS机器人程序设计

2018-04-09

L1-Introduction to Reinforcement Learning

斯坦福强化学习 课件L1-Introduction to Reinforcement Learning

2018-04-09

模型预测控制(Model Predictive Control: Theory and Design)

模型预测控制(Model Predictive Control: Theory and Design)不是扫描版,很清晰

2018-04-08

空空如也

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

TA关注的人

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