自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 MyBatis(技术NeiMu):核心处理层(Executor)

回顾Executor模板方法BaseExecutor一级缓存一级缓存简介一级缓存的管理CacheKey如何生成重载的query方法update方法的细节一级缓存清空的情况事务相关操作的细节回顾前面我们看了MyBatis的StatementHandler,而StatementHandler是用于跟数据库进行交互的,并且完成调用ResultSetHandler完成结果集的映射,并且StatemenHandler采用了一个装饰者模式,实际上得到的所有StatementHandler都是RoutingStat.

2021-12-16 20:25:29 900

原创 计网总结(网络层)

网络层总结(IP协议簇)知识点网络层主要的协议IP地址形式的发展IPV4数据报格式路由算法无子网划分时的路由算法出现子网划分时的路由算法形成超网之后的路由算法网络层的协议ARP协议ICMP协议路由选择协议内部网关协议RIPOSPF外部网关协议BGPIPV6IPV4如何过渡到IPV6网络层总结(IP协议簇)知识点知识点如下ARP、ICMP、ICGP协议,重点在于ARP和ICMPIP地址的分类、IP地址组成、IP地址的演化IPV4数据报格式无子网划分的路由器的分组转发算法子网划分、子网划分之.

2021-12-15 18:10:10 2639

原创 计网总结(传输层)

知识点多路复用与解复用UDPTCP可靠传输的实现RDT停止等待协议连续ARQ协议GBN协议SR协议GBN协议与SR协议的区别TCP实现可靠传输GBN的实现SR的实现流量控制拥塞控制TCP的报文段TCP的可靠连接为什么是三次握手,两次行不行,四次、五次呢?TCP的连接释放传输层在网络层提供的服务基础上,实现了端对端之间的服务知识点UDPTCPUDP和TCP如何实现复用和解复用TCP如何实现可靠传输、流量控制、拥塞控制TCP的连接建立与连接拆除,通俗来说就是三次握手、四次挥手总的来说,能把.

2021-12-15 18:07:35 1407

原创 MyBatis(技术NeiMu):核心处理层(StatementHandler)

回顾StatementHandlerRoutingStatementHandlerBaseStatementHandlerParameterHandlerDefaultParameterHandlerSimpleStatementHandler创建Statement执行查询执行修改PrepareStatementHandler创建Statement执行查询执行修改绑定实参CallableStatementHandler回顾StatementHandlerStatementHandler接口是MyBa.

2021-12-12 21:20:40 955

原创 # MyBatis(技术NeiMu):核心处理层(ResultSetHandler)

回顾ResultSetHandlerDefaultResultSetHandlerhandlerResultSets方法ResultSet的迭代过程ResultSetWrapper构造方法映射回顾前面我们已经了解了MyBatis的整个初始化过程,与SQL节点的解析与SQL节点的SQL是如何与实参进行绑定起来、如何根据实参进行动态拼接,下面来看一下MyBatis是如何处理结果集的ResultSetHandlerMyBatis会根据SQL映射配置文件中定义的映射规则,比如resultMap标签、res.

2021-12-12 21:11:16 1217

原创 MyBatis(技术NeiMu):核心处理层(SqlNode和SqlSource)

回顾SqlNode与SqlSourceSqlSource组合模式OGNL表达式OgnlCacheDynamicContextContextMapSqlNodeMixedSqlNodeStaticSqlNodeTextSqlNodeSqlSourceBuilderParameterMappingTokenHandlerParameterMappingBoundSqlDynamicSqlSource总结一下动态SQL的解析拓展:${}和#{}的区别RawSqlSource回顾前面我们已经看了整个MyBat.

2021-12-12 21:08:58 751

原创 MyBatis(技术NeiMu):核心处理层(SQL映射配置文件解析:select、insert、update、delete标签的解析)

回顾buildStatementFromContextSqlSourceMappedStatementMapperStatementBuilder的parseStatementNode方法刷新缓存与使用缓存解析include标签解析selectKey标签LangDriverNodeHandler解析SQL总结一下Mapper的解析过程绑定Mapper接口处理incomplete*集合回顾前面我们已经看了SQL映射配置文件上的一些核心标签是如何解析的了,同时也认识了二级缓存的构建过程,下面来看一下对于s.

2021-12-12 20:57:15 733

原创 MyBatis(技术NeiMu):核心处理层(SQL映射配置文件解析)

回顾XMLMapperBuilder判断SQL映射文件是否已经解析过解析mapper标签解析cache子标签解析cache-ref子标签解析parameterMap子标签解析resultMap子标签ResultMapping对象ResultMap对象其他标签的处理constructor标签的处理Resolve处理解析SQL子标签回顾上一章我们已经分析了,MyBatis是如何进行初始化的了,采用建造者模式去创建出Configuration,创建者主要是XMLConfigBuilder,指挥者为SqlSe.

2021-12-12 20:49:27 1245

原创 MyBatis(技术NeiMu):核心处理层(MyBatis的初始化)

回顾核心处理层MyBatis初始化建造者模式初始化!BaseBuilder!XMLConfigBuilderparseConfiguration解析Properties标签解析settings标签加载vfs加载logImpl解析typeAlias标签解析plugins节点解析objectFactory标签解析ObjectWrapperFactory标签解析reflectorFactory标签对settings剩下的子标签的解析解析environments标签解析databaseIdProvider标签解析.

2021-12-12 20:35:11 495

原创 浅谈缓存与数据库的一致性问题

前言面试经常问缓存与数据库的数据如何保持一致性,很有必要研究一下这个问题,首先提前声明,以下分析都是要基于提高吞吐量的前提下进行,要是抛弃吞吐量这个前提,最直接的办法就是上分布式锁,让所有读写请求都串行化,肯定可以解决了数据库的一致性问题,但吞吐量就很显然会下降!本质个人觉得,解决缓存与数据库不一致性的问题可以细分为下面这两个问题操作数据库肯定是更新数据,那么操作缓存是更新数据还是删除数据呢?先操作数据库还是先操作缓存呢?下面我们逐个问题进行分析Cache的写机制和读机制我们首先要对现在

2021-11-25 20:24:06 773

原创 MyBatis(技术NeiMu):基础支持层(类型转换、日志模块与类加载模块)

回顾MetaObject类型转换TypeHandlerTypeHandlerRegistry注册TypeHandler对象TypeAliasRegistry注册别名日志模块设计模式——六大原则日志适配器类加载模块ResolverUtilIsAAnnotatedWithVFS回顾上一篇分析了几个反射工具,还有对类数据的封装MetaClass,对实例数据的封装ObjectWrapper和创建ObjectWrappe的ObjectWrapperFactoryMetaObjectObjectWrapper.

2021-11-21 18:21:30 598

原创 # MyBatis(技术NeiMu):基础支持层(Transaction与Binding)

回顾TransactionJdbcTransaction获取连接提交、回滚、关闭ManagedTransactionTransactionFactoryJdbcTransactionFactoryManagedTransactionFactorybinding模块MapperRegistry注册Mapper与对应的MapperProxyFactory获取Mapper接口的代理对象MapperProxyFactoryMapperProxyPlainMethodInvokerMapperMethodSqlCo.

2021-11-21 18:08:51 749

原创 MyBatis(技术NeiMu):基础支持层(DataSource)

回顾DataSourceDataSourceFactoryUnpooledDataSourceFactoryPooledDataSourceFactoryJndiDataSourceFactoryJNDIUnpooledDataSourcegetConnectioninitializeDriverDriverManager.getConnectionconfigureConnectionPooledDataSourcePooledConnectionPoolStatePooledDataSource的其他.

2021-11-21 17:56:15 1340

原创 MyBatis(技术NeiMu):基础支持层(Property工具集)

回顾Property工具集PropertyTokenizerPropertyNamerPropertyCopierMetaClassbuildPropertyhasGetter和hasSetterObjectWrapper和ObjectWrapperFactoryObjectWrapperCollectionWrapperBaseWrapperresolveCollectiongetCollectionValuesetCollectionValueObjectWrapperFactory回顾上一篇分析.

2021-11-21 17:46:11 589

原创 MyBatis(技术NeiMu):基础支持层(解析器模块与反射模块)

回顾基础支持层解析器模块XPathParsercommonConstructorcreateDocumenteval方法针对evalString的特殊处理反射模块Reflector和ReflectorFactoryReflectorgetDefaultConstructor方法addGetMethods方法addSetMethods方法addFields方法最后的处理ReflectorFactoryfindForClass回顾前面我们已经认识了MyBatis的整体架构,下面就从下往上去了解一下具体的细.

2021-11-21 17:38:27 662

原创 MyBatis(技术NeiMu):基础支持层(类型转换模块与ObjectFactory)

回顾类型转换模块TypeParameterResolver解析字段类型的——resolveFieldType解析方法参数列表中各个参数的类型——resolverParamTypes解析方法返回值的类型——resolverReturnTyperesolveTypeType接口resolverParameterizedTyperesolverTypeVarObjectFactorycreate(Class type)create(Class type,List......)处理集合接口确定好类型后创建对象回.

2021-11-21 17:23:49 408

原创 MyBatis(技术NeiMu):整体架构

ORMMyBatis的整体架构基础支持层核心处理层接口层ORM什么是ORM呢?首先我们来认识一下JDBC,JDBC是Java与数据库交互的统一API,其实JDBC分为两组API一组是面向Java应用程序开发人员的API另一组是面向数据库驱动程序开发人员的API这两组怎么进行区分呢?前者是一个标准的Java API,是独立于各个数据库厂家来实现的;而后者则是交由数据库驱动开发人员用于编写数据库驱动的,是前者的底层支持,不同的数据库会有不同的API回顾正题ORM是指Object Rela.

2021-11-21 17:19:10 892

原创 Spring(二十):ObjenesisCglibAopProxy

回顾ObjenesisCglibAopProxy拦截器链如何形成自定义拦截CglibMethodInvocation回顾上一章仔细分析了Spring对于JDK代理的代理类的invoke方法,也填下了之前没有接触AOP导致循环依赖未彻底弄明白的坑,下面就认识一下Spring对于Cglib代理是如何实现的ObjenesisCglibAopProxy仍然都是由ObjenesisCglobAopProxy创建的可以看到其构建方法仅仅只是初始化了父类而已拓展:这里拓展一下之前是如何使用Cglib代理.

2021-11-03 18:52:01 531

原创 Spring(十八):AOP——寻找匹配的增强器

回顾返回AbstractAdvisorAutoProxyCretorfindAdvisorsThatCanApplyAopUtilscanApply方法AOP——创建切面createProxy方法封装Advisors创建代理creatAopProxt回顾上一篇,我们已经看了如何AOP如何对标签进行解析,并且生成了一系列的增强器,比如建言增强器、同步实例化增强器、DeclaredParent增强器,但找到这些增强器并不一定都适用,还要进行匹配的返回AbstractAdvisorAutoProxyCre.

2021-11-02 21:40:34 436

原创 Spring(十九):AOP代理——JdkDynamicAopProxy、填坑:AOP代理与上循环依赖

回顾JdkDynamicAopProxy曝光代理对象拦截器链的执行填坑:AOP曝光与创建Bean时的曝光getProxy回顾之前我们已经详细说明了Bean是如何被代理的,最终Bean会被解析成JdkDynamicAopProxy或者ObjenesisCglibAopProxy对象了,对应JDK代理和Cglib代理,下面就来仔细看看这两个对象吧还是回到之前DefaultAopProxyFactory的createAopProxy这里的config已经有了之前解析出来的增强器和拦截器了(一个总的数组.

2021-11-02 21:29:31 1066

原创 Spring(十七):AOP——获取增强器

回顾获取增强器getAdvisor方法获取切入点取出匹配的注解封装数据根据切入点信息生成增强方法初始化增强器AspectJMethodBeforeAdviceAspectJAfterAdvice增加同步实例增强器获取DeclareParents注解回顾前面已经讲述了大致的AOP流程,从解析配置文件里面的AOP标签到创建AOP代理时去获取所有的增强方法,但对于增强方法的获取还没有看到具体实现的底层,下面就来看看具体的底层实现获取增强器回到ReflectiveAspectJAdvisorFactory.

2021-10-31 21:16:54 403

原创 JVM(七):类加载器模型

回顾类加载器:ClassLoader类加载器与类类加载器模型常用的类加载器启动类加载器扩展类加载器应用类加载器双亲委派模型双亲委派模型的工作过程破坏双亲委派模型第一次破坏双亲委派模型第二次破坏双亲委派模型第三次破坏双亲委派模型回顾上一篇已经研究了整个类的加载过程,从加载到最后面的初始化,在类加载过程中,起到比较关键作用的是类加载器,下面就来认识一下这个类加载器是做什么的类加载器:ClassLoader类加载器的作用就是实现可以通过一个类的全限定名来获取描述该类的二进制字节流的动作类加载器与类虽.

2021-10-31 15:39:00 323

原创 JVM(六):虚拟机类加载机制

回顾概述类加载的时机类加载的过程加载验证文件格式验证元数据验证字节码验证符号引用验证准备解析类或接口的解析字段解析方法解析接口方法解析初始化回顾上一篇我们已经看过了Class文件的格式,认识了Class文件中描述的各类信息,但Class文件最终都需要被加载虚拟机中之后才能被运行和使用,下面就来看一下JVM虚拟机是如何加载这些Class文件的概述首先来谈谈虚拟机的类加载机制虚拟机的类加载机制是指虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机.

2021-10-30 22:05:04 263 1

原创 JVM(五):类文件结构

平台无关性Class类文件的结构Class的数据类型无符号数表魔数与Class文件的版本常量池CONSTANT_Class_infoCONSTANT_Utf8_infoCONSTANT_Integer_infoCONSTANT_Float_infoCONSTANT_Long_infoCONSTANT_Double_infoCONSTANT_String_infoCONSTANT_Fieldref_infoCONSTANT_Methodref_infoCONSTANT_InterfaceMethod-ref.

2021-10-29 22:17:27 282

原创 Spring(十六):创建AOP代理

使用AOP动态AOP标签AspectJAutoProxyBeanDefinitionParser解析器parse函数注册AnnotationAwareAspectJAutoProxyCreator注册或者升级AnnotationAutoProxyCreator处理proxy-target-class以及expose-proxy属性创建AOP代理AnnotationAwareAspectAutoProxyCreator的架构wrapIfNecessary寻找需要增强的方法获取所有的增强this.adviso.

2021-10-29 22:07:10 434

原创 记自己在用友的三个月实习经历

博主只是一个双飞且非科班的一个小Java后端开发,这篇文章总结一下自己在用友的三个月实习经历(用友广东分公司)大二下学期的求职本着给自己找一段实习经历填充一下自己的简历,大二下学期刚开始的时候就在边做项目边复习了,那时候在做工作室的一个社交活动类的小程序,并且在主要复习着MySQL与Redis两个数据库和一些Java基础,那段时间的复习是通过看书来复习的,并且我也开始写博客记录一下自己的读书笔记JavaJava核心技术卷MySQl《MySQL技术内幕》《Innodb技术内幕》

2021-10-28 09:46:07 15774 12

原创 Spring(十四):继续创建单例Bean,提前曝光、属性注入与初始化Bean

回顾addSingletonFactory方法populateBean方法根据注入的类型进行提取依赖beanAUTOWIRE_BY_NAMEunsatisfiedNonSimplePropertiesPropertyDescriptor[] pds = bw.getPropertyDescriptors();PropertyValues pvs = mbd.getPropertyValues();AUTOWIRE_BY_TYPEresolveDependencygetLazyResollutionProx.

2021-10-24 16:39:35 656

原创 JVM(四):经典垃圾收集器

回顾垃圾收集器Serial收集器ParNew收集器并发与并行Parallel Scavenge收集器自适应调节策略Serial Old收集器Parallel Old收集器CMS收集器初始化标记并发标记重新标记并发清除Garbage First收集器Mixed GC模式跨引用问题如何解决如何保证用户线程与垃圾清除线程不干扰运行如何建立可靠的停顿预测模型G1收集器的运行流程关于采用的收集算法回顾前面我们已经分析了HotSpot对于垃圾算法的实现了,但也仅仅还是处于理论的阶段,而垃圾收集器正是这些所有理论的.

2021-10-23 22:34:23 177

原创 JVM(三):HotSpot的算法细节实现

回顾根节点枚举准确式垃圾回收安全点(SafePoint)缩减垃圾收集器等待时间保证轮询操作的原子性安全区域(Safe Region)记忆集与卡表写屏障伪共享并发情况下的可达性分析增量更新原始快照回顾前面一文了解了垃圾回收如何进行标记,并且认识了三种常用的垃圾清除算法标记清除标记复制标记整理下面就来看下在Java虚拟机是如何来实现这些算法的根节点枚举根节点枚举是优化可达性分析算法中从GC Roots集合找引用链操作的,也就是优化判断是否存活的操作,根节点指的就是GC Roots集合中的G.

2021-10-21 20:01:25 409

原创 JVM(二):垃圾收集器与内存分配策略

回顾垃圾收集对象已死引用计数法可达性分析算法再谈引用生存还是死亡回收方法区垃圾收集算法分代收集理论标记——清除算法标记——复制算法Appel式回收标记——整理算法回顾前面我们已经简单认识了,JVM的运行时内存,下面就认识一下Java里面的GC收集与内存分配Java对于内存动态分配与内存回收技术已经很成熟,整体上都是自动化的,但我们仍然需要去了解垃圾回收和内存分配,因为我们需要去排查各种内存溢出、内存泄漏等问题,并且垃圾收集可能会成为高并发量的瓶颈,这一系列的问题就需要我们手动地去给垃圾收集、内存分配.

2021-10-19 22:44:30 139

原创 Spring(十三):创建Bean——使用构造方法创建Bean

回顾使用构造方法构建Beaninstantiate方法实例化策略没有覆盖方法的实例化拥有覆盖方法的实例化总结一下回顾前面已经看了整个Bean的加载过程了,并且在上一章已经看到了,Spring如何对Bean的构造方法进行筛选,Spring将筛选构造方法和使用构造方法创建Bean都交由了ConstructResolver负责下面就看下,Spring如何利用构造方法来创建Bean的使用构造方法构建Bean先看一下ConstrutResolver找到了构造方法是如何实例Bean的可以看到,代码为b.

2021-10-16 22:59:20 2271

原创 JVM(一):自动内存管理与对象创建

概述JDK、JRE、JVM的关系自动内存管理运行时数据区域程序计数器Java虚拟机栈局部变量表本地方法栈Java堆方法区运行时常量池直接内存对象创建对象创建的并发问题对象的内存布局对象头实例数据对齐填充对象的访问定位两种访问方式的优缺点概述JVM其实指的就是Java虚拟机,要知道Java之所以获得如此广泛的认可,除了它是一门结构严谨、面向对象的编程语言之外,它还摆脱了硬件平台的束缚,实现了"一次编写,到处运行"的概念;还提供了一种相对安全的内存管理和访问机制,避免了绝大部分内存泄漏和指针越界问题;实现.

2021-10-16 19:49:50 149

原创 Java并发(十三):读写锁之间的锁降级和锁升级

回顾锁降级锁降级的必要性锁升级回顾之前已经分析了读写锁之间是如何进行加锁的,下面就看看,读写锁之间怎么进行锁降级与锁升级的锁降级读写锁的锁降级指的是写锁降级成为了读锁当一个线程获取了写锁,并且又获取了读锁(获取写锁的线程可以获取读锁),那么当该线程释放了写锁时,该线程拥有的锁就会进行降级,变为了读锁,其实这个实现从之前看加锁源码就知道了,读锁和写锁的获取都是分开的,所以写锁的释放不会影响到读锁的持有锁降级的必要性锁降级的情景是,拿了写锁,然后再拿读锁,这有什么必要性吗?拿了写锁我就进行修改了.

2021-10-16 11:28:01 1759 3

原创 Java并发(十一):读写锁——写锁

概述ReentrantReadWriteLock特性使用方法读写锁的实现分析如何使用位拆分去表示两种锁的重入状态呢?如何判断读锁和写锁获取写锁写锁的获取lock方法tryAcquiregetExclusiveOwnerThreadexclusivesetState写锁的释放tryRelease概述ReentrantLock和Mutex都是一个排他锁,也就是说,同一时刻只有一个线程可以去获取这把锁但读写锁并不完全是排他锁,同一时刻是允许多个读线程来进行访问的,读写锁实际上指的是一对锁,读锁和写锁读锁.

2021-10-16 11:27:16 1019

原创 Java并发(十二):读写锁——读锁

回顾读锁读锁的获取tryAcquireShared记录各个线程的重入次数HoldCounterreadHolds.getsetInitialValue方法set方法假如第一次获取失败回顾前面我们已经看了写锁是怎样进行获取和释放的,下面就来看看读锁的获取和释放读锁写锁是一个排他锁,而读锁却是一个共享锁,而且还支持可重入,并且能被多个线程同时获取读锁的获取可以看到,其底层的实现也是AQS,只不过是AQS的共享模式,并且执行的是AQS的acquireShared方法源码如下 publi.

2021-10-16 11:22:11 549

原创 Spring(十二):bean的加载——创建bean

回顾前面已经看了在加载Bean的时候,如何去解决循环依赖的问题,解决完循环依赖,就到创建Bean的步骤了,而创建bean的步骤是紧紧接着创建Bean实例Bean根据范围会分为几种单例原型自定义范围每种范围都会有自己不同的生命周期创建单例Bean源码如下// Create bean instance.//判断是不是单例模式if (mbd.isSingleton()) { //调用getSingleton方法 sharedInstance = getSingleton(be

2021-10-14 21:42:20 431 1

原创 Spring(十一):bean的加载——检测循环依赖

回顾bean的加载getBean方法doGetBean方法从缓存中获取单例beangetSingleton原型模式下解决循环依赖判断当前原型Bean是否正在创建中从容器中取出RootBeanDefinitions合并RootBeanDefinition加载依赖bean获取RootBeanDefinitions的依赖判断当前依赖的bean是否产生循环依赖注册依赖bean回顾前面我们已经看过了对于XML中的bean、alias、import、beans标签的解析现在IOC容器中已经有着bean的配置了,.

2021-10-07 21:04:19 1895 7

原创 计网:自顶向下(第一章)

互联网层次Internet什么是网络、计算机网络、互联网什么是协议网络的边缘通信模式通信服务不可靠数据传输可靠数据传输流量控制和拥塞控制网络的核心电路交换FDM(频分)TDM(时分)分组交换排队延迟和丢失关键功能存储转发方式互联网网络结构分组丢失、延时和吞吐量分组延时ICMP协议分组丢失吞吐量协议层次以及服务模型服务与协议的关系协议栈ISO/OSI参考模型总结互联网层次应用层:在传输层的基础上,实现不同应用传输层:在网络层的基础上,提供通信安全的一系列协议服务网络层:扩展了链路层的服务,邻居之间.

2021-10-04 22:09:28 266

原创 Redisson(一):分布式下高并发的问题

Redis分布式锁实现高并发情境下出现的问题锁续命Redis分布式锁为什么要用到分布式锁呢?对于单机项目来说,不需要使用到分布式锁,只要使用自己JVM的锁就够用了,但是当项目搭上了集群之后,同个项目是有几个实例去对外提供服务的,那么就需要使用分布式锁,本质来说分布式锁就是让不同实例之前可以使用同一把锁实现Redis作分布式锁,本质上就是使用了一条set命令setnx key value这个命令的作用是假如key不存在,就如一般的set key value命令一样,只是往数据库添加键值对.

2021-10-03 14:53:22 1462

原创 Redisson(二):分布式锁——加锁过程

RedissonRedisson的使用源码分析getLockRedissonLock对象locktryAcquiretryAcquireAsynctryLockInnerAsync总结一下加锁过程Watch dogscheduleExpirationRenewalrenewExpirationrenewExpirationAsyncget方法future.getNow().getLatch().tryAcquire(ttl, TimeUnit.MILLISECONDS);RFuture接口源码解析subs.

2021-10-03 14:51:43 2803

空空如也

空空如也

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

TA关注的人

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