- 博客(34)
- 收藏
- 关注
原创 Mybatis执行流程
代理封装和SQL执行。Mybatis核心原理就分析完了,相比较Spring源码简单了很多,但代码的优雅度和优秀的设计思想一点也不亚于Spring,也是非常值得我们好好学习掌握的。不过这3篇只是分析了Mybaits的核心执行原理,另外还有插件怎么扩展、拦截器会拦截哪些方法以及Mybatis和Spring的整合又是怎么实现的呢?读者们可以好好思考下,答案将在下一篇揭晓。
2024-04-22 21:29:35
882
原创 mybatis之配置文件
上一篇分析了Mybatis的基础组件,Mybatis的运行调用就是建立在这些基础组件之上的,那它的执行原理又是怎样的呢?在往下之前不妨先思考下如果是你会怎么实现。解析配置文件的流程虽然比较长,但逻辑一点都不复杂,主要就是获取xml配置的属性值,实例化不同的配置对象,并将这些配置都丢到对象中去,我们只需要重点关注哪些对象被注册到了中去,最后根据对象实例化对象并返回,而就是用来创建SqlSession。
2024-04-22 20:40:57
899
原创 mybatis之深入理解
Mybatis是一款半自动的ORM框架,是目前国内Java web开发的主流ORM框架,因此作为一名开发者非常有必要掌握其实现原理,才能更好的解决我们开发中遇到的问题;同时,Mybatis的架构和源码也是很优雅的,使用了大量的设计模式实现解耦以及高扩展性,所以对其设计思想,我们也非常有必要好好理解掌握。(PS:本系列文章基于3.5.0版本分析)
2024-04-22 16:13:40
669
原创 java的springboot之深入理解
可以看到有用于文件编码的(FileEncodingApplicationListener),有加载日志框架的(LoggingApplicationListener),还有加载配置的(ConfigFileApplicationListener)等等一系列监听器,SpringBoot也就是通过这系列监听器将必要的配置和组件加载到容器中来,这里不再详细分析,感兴趣的读者可以通过其实现的。这个方法不会陌生吧,之前已经分析过了,这里不再赘述,至此SpringBoot的容器就启动了,但是Tomcat启动是在哪里呢?
2024-04-20 21:28:11
896
原创 java的springmvc之深入理解
前端发起请求,断点停在了AbstractHandlerMethodMapping.MappingRegistry#getMappingsByUrl方法上,以前端发起的请求路径,从urlLookup上获取对应的值。发现最终是由onRefresh方法来进行具体处理的,并且这个onRefresh方法在FrameworkServlet里面是个空方法,是由它的子类DispatcherServlet来实现的。这时我也不知道每个的具体作用。最后看看请求分发的主流程,也是springMVC最核心的代码。
2024-04-19 22:14:25
949
原创 java的spring AOP之深入理解
我相信有经验的Java开发都遇到过这样一个BUG,在Service实现类中调用本类中的另一个方法时,事务不会生效,这是因为直接通过this调用就不会调用到代理对象的方法,而是原对象的,所以事务切面就没有生效。AOP,也就是面向切面编程,它可以将公共的代码抽离出来,动态的织入到目标类、目标方法中,大大提高我们编程的效率,也使程序变得更加优雅。代理(Proxy):目标对象被织入增强后,就会产生一个代理对象,该对象可能是和原对象实现了同样的一个接口(JDK),也可能是原对象的子类(CGLIB)。
2024-04-19 20:38:07
587
原创 java的Spring事务之深入理解
(平台)事务管理器,Spring 事务策略的核心。: 事务定义信息(事务隔离级别、传播行为、超时、只读、回滚规则)。: 事务运行状态。我们可以把 PlatformTransactionManager接口可以被看作是事务上层的管理者,而 TransactionDefinition和 TransactionStatus这两个接口可以看作是事务的描述。会根据 TransactionDefinition。
2024-04-18 14:47:38
809
原创 java的spring循环依赖、Bean作用域等深入理解
这个概念很容易理解,简单说就是两个类相互依赖,类似线程死锁的问题,也就是当创建A对象时需要注入B的依赖对象,但B同时也依赖A,那到底该先创建A还是先创建B呢?在Spring中主要有reqest、session、singleton、prototype等等几种作用域,前面我们分析了singleton创建bean的原理,是通过缓存来实现的,那么其它的呢?还是回到try {throw ex;});// 该方法是FactoryBean接口的调用入口try {finally {
2024-04-18 09:40:51
899
原创 java的JDK动态代理
JDK动态代理是指:代理类实例在程序运行时,由JVM根据反射机制动态的生成。也就是说代理类不是用户自己定义的,而是由JVM生成的。由于其原理是通过Java反射机制实现的,所以在学习前,要对反射机制有一定的了解。
2024-04-17 17:54:45
844
原创 java的Spring的Bean实例化深入理解
前两篇文章分析了Spring XML和注解的解析原理,并将其封装为对象存放到IOC容器中,而这些只是refresh方法中的其中一个步骤——,接下来就将围绕着这些对象进行一系列的处理,如对象方法的调用、对象方法的调用以及Bean实例的创建都离不开这些BeanDefinition对象。下面就来看看Spring是如何处理这些对象的。
2024-04-17 11:01:08
792
1
原创 java的Spring XML和注解解析深入理解
本篇是Spring源码分析的第一篇,只是分析了refresh中的方法,我们可以看到仅仅是对XML的解析和bean定义的注册缓存,Spring就做了这么多事,并考虑到了各个可能会扩展的地方,那我们平时做的项目呢?看似简单的背后是否有深入思考过呢?
2024-04-16 11:40:05
1117
1
原创 java的JVM垃圾回收之深入理解
前言JVM的自动内存管理得益于不断发展的垃圾回收器,从最初的单线程收集到现在并发收集,垃圾回收器的开发者们一直在致力于如何降低GC过程中的停顿时间(STW)以及提高吞吐量,但直到现在也不存在一款完美的垃圾回收器,只能根据不同的场景选择最合适的。所以需要了解每款垃圾回收器出现的背景、原因,并掌握各种垃圾回收器的设计原理、算法实现细节以及各个垃圾回收器的优劣对比,这样才能让我们在调优时做出最合适的选择。这部分内容博主准备分为两篇文章进行总结讲解,本篇主要是对垃圾收集算法的思想以及目前稳定商用。
2024-04-15 16:16:22
592
1
原创 java的深入探究JVM之类加载与双亲委派机制
前言前面学习了虚拟机的内存结构、对象的分配和创建,但对象所对应的类是怎么加载到虚拟机中来的呢?加载过程中需要做些什么?什么是双亲委派机制以及为什么要打破双亲委派机制?类的生命周期类的生命周期包含了如上的7个阶段,其中验证准备解析统称为连接 ,类的加载主要是前五个阶段,每个阶段基本上保持如上顺序开始(仅仅是开始,实际上执行是交叉混合的),只有解析阶段不一定,在初始化后也有可能才开始执行解析,这是为了支持动态语言。加载加载就是将字节码的二进制流转化为方法区。
2024-04-15 11:02:05
1607
2
原创 java的深入探究JVM之对象创建及分配策略
前言Java是面向对象的语言,所谓“万事万物皆对象”就是Java是基于对象来设计程序的,没有对象程序就无法运行(8大基本类型除外),那么对象是如何创建的?在内存中又是怎么分配的呢?正文一、对象的创建方式在Java中我们有几种方式可以创建一个新的对象呢?总共有以下几种方式:new关键字反射clone反序列化为了便于说明和理解,下文仅针对new出来的对象进行讨论。二、对象的创建过程。
2024-04-14 16:31:25
851
1
原创 java的深入探究JVM之内存结构
前言Java作为一种平台无关性的语言,其主要依靠于Java虚拟机——JVM,我们写好的代码会被编译成class文件,再由JVM进行加载、解析、执行,而JVM有统一的规范,所以我们不需要像C++那样需要程序员自己关注平台,大大方便了我们的开发。另外,能够运行在JVM上的并非只有Java,只要能够编译生成合乎规范的class文件的语言都是可以跑在JVM上的。而作为一名Java开发,JVM是我们必须要学习了解的基础,也是通向高级及更高层次的必修课;但JVM的体系非常庞大,且术语非常多,所以初学者对此非常的头疼。
2024-04-14 12:03:35
2114
1
原创 java的volatile深入理解
Volatile多线程之间的可见性保证1、可见性实现:线程本身并不直接与主内存进行数据的交互,而是通过线程的工作内存(相当于CPU高级缓冲区,这么做的目的还是在于进一步缩小存储系统与CPU之间速度的差异,提高性能)来完成相应的操作。这也是导致线程间数据不可见的本质原因。因此要实现volatile变量的可见性,直接从这方面入手即可。对volatile变量的写操作与普通变量的主要区别有两点:(1)修改volatile变量时会强制将修改后的值立即刷新的主内存中。
2024-04-13 19:05:25
566
原创 java的ConcurrentHashMap深入理解
原数组长度为 n,所以我们有 n 个迁移任务,让每个线程每次负责一个小任务是最简单的,每做完一个任务再检测是否有其他没做完的任务,帮助迁移就可以了,而 Doug Lea 使用了一个 stride,简单理解就是步长,每个线程每次负责迁移其中的一部分,如每次迁移 16 个小任务。,然后向上取最近的 2 的 n 次方】。迁移时,利用了数组的大小时2的n次方,(n-1)与位全是1的特点,形成了高低链,将链中的元素成批的迁移到新数组中去,而不需要一个个计算hash,再到新数组中找位置。
2024-04-12 21:46:59
1015
原创 java的阻塞队列深入理解
Linklist是相比有两把锁,因为新增在链尾,获取从链头add和remove方法使用的还是offer和poll方法,只是满了或者空了会抛出异常put和take只是会在满了或者空了的时候会调用await方法进行等待阻塞。
2024-04-12 21:04:01
650
原创 java的线程池深入理解
首先用RunnableFuture对任务封装-》执行ThreadPoolExecutor的executes方法-》判断当前执行线程是否小于核心线程数-》若小于则创建线程进行执行-》封装在实现了Runnable的worker中-》执行worker的run方法-》在run方法中调传进来的任务-》若是大于核心线程数则放入阻塞队列中去-》若核心线程都在跑并且阻塞队列也满了,判断是否大于最大线程数-》若小于最大线程数-》则创建临时线程进行跑-》若大于最大线程数,则用拒绝策略进行拒绝。那是在哪里做的操作呢?
2024-04-12 16:24:46
1885
原创 java的线程间协作
JDK中提供三个版本的join方法,其实现与wait方法类似,join()方法实际上执行的join(0),而join(long millis, int nanos)也与wait(long millis, int nanos)的实现方式一致,暂时对纳秒的支持也是不完整的。不过有一点需要注意,这里的join只调用了wait方法,却没有对应的notify方法,原因是Thread的start方法中做了相应的处理,所以当join的线程执行完成以后,会自动唤醒主线程继续往下执行。至于为什么,大家可以先思考一下。
2024-04-11 16:30:50
953
原创 java的condition深入理解二
则当前节点对应的线程将被唤醒,以便它能够重新检查等待队列的状态并采取适当的行动。这是AQS处理同步和条件等待时的重要部分,确保线程在等待时能够正确响应各种变化。将头结点的指向设置成null从而从条件链表中删除。的状态正确地进行下一步操作。不再有效(被取消)或者无法将其状态设置为。这段代码是为了确保当前节点。
2024-04-11 15:03:01
116
原创 java线程interrupt
这样,被中断的线程可以在捕获异常后检查中断状态,并据此进行清理工作或退出循环。因此,如果线程在等待锁的过程中被中断,它将继续等待,直到它最终能够获取到锁。例如,一个监听用户输入的线程在接收到特定的中断信号时,可能会调用自身的。被中断的线程不会立即停止执行,而是会在检查中断状态后决定是否响应中断。方法本身不会清除中断状态,所以在唤醒后,如果需要的话,你可能需要手动清除中断状态,通过再次调用。调用响应中断,在Java中,线程的中断是一种协作机制,线程需要自行检查中断状态并响应。如果线程在等待锁的过程中被中断,
2024-04-11 12:44:04
982
原创 java的reentrantlock深入理解
线程入队后能够挂起的前提是,它的前驱节点的状态为SIGNAL,它的含义是“Hi,前面的兄弟,如果你获取锁并且出队后,记得把我唤醒!非公平锁tryAcquire的流程是:检查state字段,若为0,表示锁未被占用,那么尝试占用,若不为0,检查当前锁是否被自己占用,若被自己占用,则更新state字段,表示重入锁的次数。若当前有三个线程去竞争锁,假设线程A的CAS操作成功了,拿到了锁开开心心的返回了,那么线程B和C则设置state失败,走到了else里面。这个方法让已经入队的线程尝试获取锁,若失败则会被挂起。
2024-04-10 15:32:05
978
1
原创 java深入理解synchronized
消除锁是虚拟机另外一种锁的优化,这种优化更彻底,Java虚拟机在JIT编译时(可以简单理解为当某段代码即将第一次被执行时进行编译,又称即时编译),通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间,如下StringBuffer的append是一个同步方法,但是在add方法中的StringBuffer属于一个局部变量,并且不会被其他线程所使用,因此StringBuffer不可能存在共享资源竞争的情景,JVM会自动将其锁消除。
2024-04-10 10:52:57
805
1
原创 java的Set
每加入一个元素,会调用该元素的equals和hashcode算法,和已有的元素进行比较,若是不同就加入,若是相同则不加入(首先是比较hashcode的值,然后是equals的方法)若是改变两个从compare方法的返回值,如全都改为返回1,就能够保证怎么存就怎么取,改为-1的话,就会逆序存储,返回0的话就只有一个元素了。* hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(减少equals的判断,从而提高效率).* 调用对象的compareTo()方法和集合中的对象比较。
2024-04-09 15:39:33
857
原创 java的Map总结
Hash结构HashMap根据名称可知,其实现方法与Hash表有密切关系。在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能。数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)
2024-04-09 12:04:20
806
原创 java的list总结
可以用来存储数据,扩展了数组的功能, 数组和集合存储引用数据类型,存的都是地址值数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少。
2024-04-09 10:42:44
565
1
原创 java和python的不同处
python不需要定义类型,这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言作用范围:定义开始到定义它的代码块结束,python没有代码块的范围限制其他不同范围python:L (Local) 局部作用域 和java里的局部变量类似E (Enclosing) 闭包函数外的函数中G (Global) 全局作用域B (Built-in) 内建作用域布尔型值的表示不同方法定义java。
2024-04-08 21:27:35
418
原创 Python Pandas
是基于的一个开源 Python 库,它被广泛用于快速分析数据,以及数据清洗和准备等工作。它的名字来源是由“ Panel data”(面板数据,一个计量经济学名词)两个单词拼成的。Pandas主要采用Series和DataFrame两种数据结构。Series是一种类似一维数据的数据结构,由数据(values)及索引(indexs)组成,而DataFrame是一个表格型的数据结构,它有一组序列,每列的数据可以为不同类型(NumPy数据组中数据要求为相同类型),它既有行索引,也有列索引。
2024-03-24 15:55:48
915
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人