自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猪大肠的博客

学习,分享,记录

  • 博客(68)
  • 收藏
  • 关注

原创 容器技术:Docker搭建(通俗易懂)

Docker默认下载镜像是在其官网地址下载的,由于是外网会比较慢,所以建议配置阿里云镜像加速,来提升下载的速度。Docker有点类型我们的Git,里面的star跟GitHub上的项目star差不多,一般我们选择star最多的。如果你使用的是阿里云或者腾讯云这些云服务,测试没有显示Tomcat错误提示页面的话,一般是安全组没将端口放开。这里由于我拉取了两个版本的Tomcat,所以能看到一个是最新版本的,一个是9.0版本的。(2)、选择对应的操作系统版本,然后安装文档命令,挨个执行;(1)、查看当前镜像情况。

2023-08-02 10:09:57 1371

原创 数据结构:Mysql索引原理(通俗易懂)

在工作中如果经常写业务代码,说白了就是CURD,比如做一个查询功能,我们会将前端参数传递到后端后拼接SQL查询数据,那为了提高用户体验,查询速度肯定是越快越好,这就要求我们能够对SQL调优,让查询速度更快。

2023-06-29 22:02:55 1057

原创 HashMap学习:1.7 迁移死循环分析(通俗易懂)

JDK1.7由于采用的头插法,所以多线程情况下可能会产生死循环问题,这篇文章比较简短。

2023-06-18 18:45:47 639

原创 JVM原理:JVM垃圾回收算法(通俗易懂)

为什么程序跑久了有时会变卡,用户线程在跑时会将new出来的对象放到虚拟机堆中,当堆满了之后会发生垃圾回收,而垃圾回收过程中会STW,也就是停止用户线程运行,这种在程序层面看来就是没反应,所以如果出现这种问题,我们就要想办法让STW的时间尽量的变短;

2023-06-11 16:29:43 1032

原创 JVM原理:JVM运行时内存模型(通俗易懂)

做了几年开发,平时除了写代码造BUG和修复BUG之外,偶尔也会遇到反馈说程序较慢问题,要对程序性能排查与优化就得更深入学习,学习JVM可以帮助我们加深对JAVA的理解,让我们具备一定的性能排查与调优的能力,无非就是让程序别太卡或者别挂了,那挂了目前我遇到的主要是内存泄漏后导致OOM,或者内存分配不当,当机器内存不足时出发了Linux的保护机制,自动kill调占用内存最高的程序;所以我们要了解平时创建的对象、变量是如何存储的,这些知识点可以帮我们更好解决问题。

2023-06-10 18:15:10 3134 20

原创 多线程与高并发学习:ThreadPoolExecutor源码解析

线程池在工作中的应用非常广泛,学习其源码可以更好掌握并发相关的思想。

2023-05-18 22:55:41 431

原创 Springboot源码:自动装配流程解析

使用Spring开发时,由于项目中某些类需要提前注入到IOC容器中时,我们可以利用Springboot的自动装配,遵守其约定,将自动装配类配置到META-INF/目录下的spring.factories文件中,并指定key为org.springframework.boot.autoconfigure.EnableAutoConfiguration。这样Springboot就可以将该类注入到IOC容器中。

2023-05-14 14:08:19 457

原创 基于常用设计模式的业务框架

做开发也有好几年时间了,最近总结和梳理自己在工作中遇到的一些问题,工作中最容易写出BUG的需求就是改造需求了。一个成熟的业务系统是需要经过无数次迭代而成的,也意味着经过很多开发人员之手,最后到你这里,大部分时间都是在梳理代码,理解别人的用意。有的业务功能里面一堆IF嵌套嵌套,耦合度太过,理解起来比较费劲,也容易改出BUG。

2023-05-13 20:42:41 596 1

原创 多线程与高并发学习:ThreadLocal源码详解

保险出单场景中,业务员出单时后台需要根据业务员所在机构来决定业务流转,审计字段记录出单员信息等,这些在后端处理中需要多次用到,每笔订单都是独立对应一个业务线程,可以使用ThreadLocal将业务员代码存储到线程中,方便后续取值。

2023-03-26 19:23:18 620

原创 工作中策略模式用法及其使用场景?

笔者是金融行业,负责出单系统开发,出单按渠道来源划分有很多种方式,业务员页面直接录单的提交审核后会提交到审核员核保,对于一些特定渠道出单的,会直接自动审核。所以这边可能会有很多种场景,针对不同的渠道来源标识需要不同的逻辑进行处理。一般在代码中会根据If else 写很多的判断,考虑到开闭原则,拓展性等问题,这里使用了策略设计模式来处理。

2023-03-07 23:45:00 419

原创 工作中模板方法模式用法及其使用场景

最近有个周边系统对接我们系统进行投保的需求,周边系统会将客户填写好的投保单资料推送到我们系统,我们出完单后将单号返回给他们。此次对接的保险险种有多个,每个数据都有需要特殊处理的地方,但是他们的流程是一样的,投保单校验、入库、提交审核、自动审核等,最大的区别在于不同的险类他们的风险信息不一样,所以需要我们特殊处理。

2023-03-06 23:45:00 499

原创 工作中简单工厂模式用法及其使用场景?

大家买过保险应该知道保单,刚开始投保的时候业务员会录入标的保险期限等保险资料,录完之后会交由上级审核,审核通过后才会正式生效;当保单数据需要调整时,需要进行批改,修改完资料后提交上级机构审核,审核完成后才会生成批单。除了这两个还有暂保单、预约单等;那审核通过后,针对不同类型的单子需要不同的业务处理逻辑,所以有了PProcessor投保类型的后置处理器、EProcessor批改类型的后置处理器、TProcessor暂保类型的后置处理器。他们的处理流程相识,根据模板规范,所以都继承处理器类Processor对其

2023-03-05 23:45:00 492

原创 工作中责任链模式用法及其使用场景?

笔者是金融保险行业,有这么一种场景,业务员录完单后提交核保,这时候系统会对保单数据进行校验,如不允许手续费超限校验,客户真实性校验、费率限额校验等等,当校验一多时,维护起来特别麻烦,代码耦合度太高。

2023-03-01 23:45:00 1576

原创 工作中单例模式用法及其使用场景?

最近工作中有这么一个需求,我们系统出单后,需要同步数据到合作方,合作方对数据接收并解析反馈结果文件给我们,根据结果文件状态判断合作方系统是否解析成功,对于失败的单子,需要邮件通知相关负责人。所以这里我们需要用到邮件发送工具,在使用时如果每次都new 邮件工具那么就比较耗费堆内存空间,所以这里我们使用单例模式,在整个系统运行使用过程中,只需要new 一次即可。

2023-02-28 23:45:00 1374

原创 Java集合学习:ArrayList源码详解

根据源码我们可以看到ArrayList在取数据非常简单,直接根据下标即可获取值,但是在删除数据、添加数据时,如果下标位于头尾之间,则需要移动部分数据位置,这在插入时导致效率没有LinkedList高;所以我们在使用集合时,需要根据业务场景考虑,来选择最佳集合容器。

2023-02-27 23:45:00 913

原创 Java集合学习:LinkedList源码详解

链表不需要指定容量,只要内存够大,就可以一直存储下去。链表存储时,分配完内存空间后,只需要将引用进行关联就可以,比起ArrayList可能会造成空间移动,效率高得多。但是在存储时,我们看到它是采用遍历的方式,进行下标查询,随便使用了二分进行切割,但在数据量大的情况下自旋时间长,对CPU的消耗比较大。

2023-02-26 23:45:00 465

原创 AQS学习:ReentrantLock源码解析

ReentrantLock是可重入的互斥锁,虽然具有与synchronized相同功能,但是会比synchronized更加灵活(具有更多的方法)。ReentrantLock底层基于AbstractQueuedSynchronized。有两种锁方式公平锁和非公平锁,公平锁指线程锁定后会进入队列进行排队等待至获得锁的使用权;而非公平锁指线程锁定后会尝试获取锁,如果获取失败则进入等待队列进行排队。下面画了流程图,帮助大家更好的理解。

2023-02-22 12:36:42 620

原创 Spring源码学习:@Autowire和@Resource原理解析

最近在刷到很多文章讲解Spring IOC依赖注入时@Autowire和@Resource注解的区别,不同的文章总结出来的点有异同,所以还是看源码自己总结一下其两者的区别,及其用法。

2023-02-16 21:59:08 1332

原创 Spring AOP源码:拦截器责任链处理过程

AOP动态代理过程使用责任链设计模式,将符合条件的MethodInterceptor实现类进行层层调用,但是不一定MethodInterceptor集合中的所有都会被调用,如果某个MethodInterceptor执行过程中,没有调用其下层拦截器,直接返回了,则后面的拦截器不会进行调用。

2023-01-30 19:54:53 758

原创 Spring源码学习:三级缓存的必要性

工作中可能会碰到循坏依赖问题,所以了解其Spring设计原理,对于解决问题更加高效。在之前的文章中讲解了Spring的代码过程。这篇文章讲解Spring中三级缓存的必要性。

2023-01-20 11:26:17 3260 3

原创 HashMap源码学习:JDK1.8版本源码解析

上篇文章讲解了JDK1.8中HashMap红黑树的原理,以及节点插入、节点移除、红黑树平衡等代码流程,本篇文章对HashMap源码重点进行讲解。

2023-01-19 11:38:06 2115

原创 Spring AOP源码:代理的创建过程

当切面类指定了proxy-target-class="true"属性时,代表要使用Cglib(proxyTargetClass属性会为true),此时有机会是Cglib代理。条件1不满足时,看被代理类是否有preserverTargetClass属性,且值为true时,会将proxyTargetClass属性设置为true,此时有机会是Cglib代理。optimize为true时,此时有机会是Cglib代理。

2023-01-16 00:15:00 866

原创 HashMap源码学习:红黑树原理详解

为了保持红黑树的特性,在插入或者删除时,可能破坏其平衡结构,所以通过变色、左旋、右旋等方式来保持红黑树的平衡。

2023-01-15 11:21:09 2018

原创 Spring AOP源码:配置文件解析过程

本篇文章主要讲解AOP配置中的几个通知类的解析过程,为后续对目标类进行代理做准备;在前面的Spring IOC篇我们讲解了自定义配置的解析,AOP配置的解析过程也是其自定义注解的过程

2022-12-27 21:22:42 1016 5

原创 Spring AOP:基本概述

AOP可以对业务逻辑的各个部分进行隔离,从而是的业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

2022-12-27 17:07:00 405

原创 动态代理:Cglib原理讲解

Cglib动态代理不需要被代理类实现接口,根据原理我们知道生成的代理类是继承了被代理类,而且其方法调用方法是使用FastClass,这与JDK动态代理的反射有比较大的区别。JDK代理使用的是反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGLIB代理使用字节码处理框架ASM,对代理对象类的class文件加载进来,通过修改字节码生成子类。JDK创建代理对象效率较高,执行效率较低;CGLIB创建代理对象效率较低,执行效率高。

2022-12-11 21:11:41 1237

原创 动态代理:JDK动态代理源码学习

动态代理在开发可能使用的频率不是特别高,但在一些框架里面总能看到它的身影,例如Spring AOP就是使用JDK动态代理和CGLIB动态代理两种方法,本篇文章讲解JDK动态代理原理,看它是如何对类进行增强的。代理就是由直接调用转为间接调用,比如我们调用出单服务A,我需要在每次调用A时都记录日志,我们可以创建一个新的类及其方法B,在B中调用A,并且插入日志,这样由原先的调用A变成B,我们可以在B做一些增强操作如日志等。B就是代理类,而A就是原生类(被代理类)。

2022-12-09 23:55:25 1139

原创 Spring IoC源码:finishRefresh 完成刷新详解

Spring IOC中refresh()所有方法都讲解完了,这里面的内容非车多,花了不少时间在看,但是感觉还是比较粗糙,文章中有很多点理解得不是很到位,如果大家有更好的见解,欢迎指点评论。学习IOC过程是非常枯燥的,但是耐心去看真的能发现这个框架设计真的很厉害,拓展性做得很好,有很多地方值得我们在工作中进行参考开发。后续会发布Spring 系列的其它文章,如AOP,只有不断的学习,才能加深对Spring框架的理解。

2022-12-05 22:01:27 1760 21

原创 Spring IoC源码:createBean(下)

上篇文章讲解了实例化后,初始化属性注入过程中属性值的解析过程及其注入过程,本篇继续讲解doCreateBean流程中属性注入后的其它流程,即对bean实例进行初始化。

2022-12-05 20:59:25 708

原创 Spring IoC源码:createBean(中)

上篇文章讲解了Bean的实例化过程,包含构造器的选择、参数的创建等,本篇继续创建createBean的剩余流程,包括Bean实例化后的初始化属性注入工作,以及BeanPostProcessor的执行过程。

2022-12-03 22:31:59 455

原创 Spring IoC源码:createBean( 上)

本篇文章讲解Bean实例化过程、构造器选择、参数转换........

2022-11-29 21:08:15 640

原创 Spring IoC源码:getBean 详解

先从缓存中获取实例对象,如果有实例则进行工厂对象解析流程,判断beanName是否带&符号,决定是返回工厂对象本身还是返回真正的实例,如果是返回真正的实例,则调用工厂对象的getObject返回,如果返回值为null,并且在isSingletonCurrentlyInCreation中存在,代表是一个正在创建的bean,不完整的工厂对象,则抛出异常。

2022-11-24 23:13:45 1216 2

原创 Spring IOC源码:finishBeanFactoryInitialization详解

本篇文章讲解了bean创建前的准备工作,及其FactoryBean的概念,并且讲解了三级缓存的作用。一级缓存 singletonObjects:存放完整的Bean对象二级缓存 earlySingletonObjects:存放半成品Bean对象三级缓存singletonFactories:存放封装后的ObjectFactory,通过getObject返回实例对象,该对象可能是代理后的对象也可能是普通对象。

2022-11-23 22:33:39 467

原创 Spring IOC源码:实例化前的准备工作

上篇文章我们讲解了IOC比较重要的后置处理器注册方法,本篇文章讲解实例化前的准备工作,包括国际化、多播器创建、监听器注册等节点。

2022-11-21 21:02:03 584

原创 Spring IOC源码:registerBeanPostProcessors 详解

BeanPostProcessor和BeanFactoryPostProcessor都属于IOC后置处理器,只是两者操作的对象不一样,并且调用时间点也不一样;

2022-11-19 12:06:52 729

原创 Spring IOC源码:invokeBeanFactoryPostProcessors 后置处理器详解

本篇文章讲解了refresh方法中的prepareBeanFactory、postProcessBeanFactory、invokeBeanFactoryPostProcessors这三个方法。prepareBeanFactory其实就是BeanFactory工厂做一些准备工作,忽略某些值不被其它类所注入,以及添加一些后置处理器等。

2022-11-17 22:12:58 419

原创 Spring IOC源码:<context:component-scan>源码详解

这节学习IOC中比较重要的注解解析< context:component-scan>标签,讲解如何对包进行扫描、解析处理等工作。

2022-11-15 22:09:49 997

原创 Java NIO实战篇:使用Socket实现报文交互

最近有个对接渠道需求,对方提供文档中要求使用Socket短链接的方式进行报文交互,所以这边采用NIO方式编写Socket。

2022-11-13 07:00:00 2260

原创 Spring IOC源码:obtainFreshBeanFactory 详解(下)

本篇文章介绍了自定义命名空间的解析过程,并且编写的自定义命名空间案例加深理解。

2022-11-12 12:16:48 867

原创 Spring IOC源码:obtainFreshBeanFactory 详解(中)

这篇我们重点介绍obtainFreshBeanFactory中的默认命名空间对配置文件的处理过程。

2022-11-08 23:12:57 273

空空如也

空空如也

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

TA关注的人

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