
源码
文章平均质量分 94
理想万岁万万岁
毕业于重庆科技学院,从事java后端领域,热爱分享,热爱交友
展开
-
ThreadLocal详解,源码级的详解,快来学
先看一下的官方解释。我们可以通过实例隐式地给线程设置局部变量,即该实例可以在每一个线程内部创建一个变量的副本。而该实例我们就可以通过全局共享变量的方式创建。如下图所示很多文章中将解释为多线程环境中保证线程安全的一个类,但这种说法其实是十分片面的。从官方解释上来看,的功能仅仅是为了给多个线程设置局部变量,这和线程安全是没有关系的,线程安全针对的是全局的共享变量。从类路径来看,位于java.lang包,而非包。从其使用方法来看,无论是set()方法、get()方法、remove()方法,都。原创 2023-12-13 00:10:18 · 615 阅读 · 0 评论 -
springboot自定义banner的输出与源码解析
Banner即横幅的意思,我们在庆祝某些事情时有些显眼包总会是拉个横幅以表明意图。在我们启动springboot项目时,springboot往往也会打印出一个默认的横幅,该横幅中包含了一些信息如springboot版本号等,如下图所示。既然有默认的,当然springboot也允许我们对banner进行自定义设置,如将banner设置为文本图片,甚至关闭banner的输出。如下所示是否略显炫酷?下面我们来介绍如何自定义banner,并通过源码进行分析。原创 2023-08-16 14:52:45 · 1685 阅读 · 0 评论 -
springboot使用configtree读取树形文件目录中的配置
在classpath下添加application.yml或application.properties配置文件,或通过指定配置文件位置。通过指定额外的配置文件位置。通过导入指定位置的配置文件。但无论通过哪种方式,其配置的形式都是通过在配置文件中通过的形式添加具体配置的,且配置文件类型为yaml或properties。如下所示:properties文件内容示例yaml文件内容示例其中key1作为配置名,value1作为配置值。今天给大家介绍另一种配置形式,该配置使用文件名作为配置名,文件内容。原创 2023-08-14 16:46:35 · 860 阅读 · 0 评论 -
使用logback异步打印日志
对于每一个开发人员来说,在业务代码中添加日志是至关重要的,尤其是后端开发,如果不打印日志,在接口出现bug的时候将无法定位bug;有了日志,即使接口出现bug,也可以通过查询日志很快的定位到bug的位置。使用springboot开发的朋友使用最多的日志框架想必都是logback了吧,毕竟它是springboot官方推荐的日志框架,与springboot天然整合。再结合第三方工具lombok,当我们需要打印日志时只需要通过log.info("第一条日志");原创 2023-08-09 17:07:48 · 5559 阅读 · 1 评论 -
springboot创建并配置环境(四) - 配置扩展属性(下集)
上一篇文章:springboot创建并配置环境(三) - 配置扩展属性(上集)中我们介绍了springboot对配置文件的处理逻辑,但是由于篇幅过长,决定分上下集两部分讲解。进入方法从该方法中看到,对中的进行遍历,从中获取key为的配置属性,将其添加到集合中并返回。进入Profiles的构造方法查看,该构造方法中定义了三种profiles,分别是定义的profiles、定义的profiles和定义的profiles。我们逐个查看定义的profiles从Profiles。原创 2023-07-30 09:30:00 · 896 阅读 · 0 评论 -
springboot创建并配置环境(三) - 配置扩展属性(上集)
在上一篇文章:springboot创建并配置环境(二) - 配置基础环境中,我们介绍了springboot如何配置基础环境变量。本篇文章讨论如何处理配置文件。classpath路径下的**使用注解指定的文件、以及来自项目外部的配置文件**等。原创 2023-07-29 09:30:00 · 701 阅读 · 0 评论 -
springboot创建并配置环境(二) - 配置基础环境
springboot启动过程中配置基础环境原创 2023-07-28 09:30:00 · 691 阅读 · 0 评论 -
springboot创建并配置环境(一) - 创建环境
springboot创建运行环境的源码解析原创 2023-07-27 11:17:33 · 1447 阅读 · 0 评论 -
源码分析:springboot如何确定当前应用程序类型
从源码分析springboot如何推断出当前应用为响应式的还是非响应式的原创 2023-05-25 17:09:54 · 1298 阅读 · 0 评论 -
springboot加载命令行参数ApplicationArguments
使用springboot开发的同学们,都一定会从配置文件中读取配置。比如我们常常会在上传文件的功能中,把文件的保存路径写在配置文件中,然后在代码中通过@Value()注解从配置文件读取对应的配置,如下所示:在配置文件中定义文件路径在代码中获取保存路径// 文件路径/data/files public void upload(File file) {// 将文件保存到fileLocation中。} }这种读取配置的方式非常方便,但是有一个让人抓狂的缺点在多人协作开发的情况下,同事A在配置文件中修改。原创 2023-04-12 09:52:03 · 1844 阅读 · 1 评论 -
springboot中的第二个IOC容器BootstrapContext,超有用的
用过spring的小伙伴想必都知道IOC容器吧,spring将我们的单例对象实例化后保存到IOC容器,而且一说到IOC容器,大家第一反应都是,读过源码的同学还知道IOC容器中的单例对象都是保存在一个Map集合中的,而且是以beanName为key,单例对象为value的Map集合。但是目前大家用的肯定都是springboot了,如果面试官问你springboot中的IOC容器是什么?而你还像上面那样照本宣科按照spring的回答,那你就错了。正解:在springboot刚启动时,IOC容器为,直到。原创 2023-04-07 10:00:00 · 1512 阅读 · 0 评论 -
spring源码 - 条件注解@ConditionnalOnClass的原理分析
用过springboot的小伙伴们都知道,相比于spring,它最大的优势是帮我们省去了一大堆超大一堆繁琐的配置。比如在spring中,当我们需要在项目中整合第三方插件(如redis、mybatis、rabbitmq)时,往往需要在xml配置文件中去配置这些插件的等将其与spring进行整合。而在springboot中,他会根据项目中引入哪些插件自动地将插件进行整合,这都得益于springboot的自动装配或称为自动配置。原创 2023-03-31 10:00:00 · 5354 阅读 · 0 评论 -
java源码阅读 - LinkedHashSet
前面文章中我们从源码详细介绍了继承于HashMap的LinkedHashMap,并通过图片示例讲解了LinkedHashMap是如何在HashMap的哈希表上将各个节点通过双向链表串起来的。也讲解了基于HashMap实现的HashSet,那么是否存在类似于LinkedHashMap原理的一种Set集合?答案是肯定的,而且是我们本篇文章要讲的顾名思义,LinkedHashSet是基于LinkedHashMap实现的一个Set集合。HashMap(必选)红黑树(可选)(必选)HashSet(必选)原创 2023-03-30 10:00:00 · 464 阅读 · 0 评论 -
java源码阅读 - TreeSet
在上期文章中,我们从源码层面详细分析了java集合框架中Set一族的实现HashSet,它的内部维护了一个HashMap对象作为内部存储,也就是说HashSet的底层结构为哈希表,今天我们介绍Set的另一个实现——TreeSet,对标HashSet与HashMap的关系,我们猜想TreeSet可能会维护一个TreeMap作为内部存储,事实也确实如此,因此,TreeSet的特性均继承于TreeMap,如元素有序等。在学习TreeSet源码之前,必须对TreeMap的源码了如指掌。原创 2023-03-29 10:00:00 · 1235 阅读 · 0 评论 -
java源码阅读 - HashSet
在往期文章中,我们从源码层面详细分析了java集合框架中List的实现如ArrayListLinkedListVectorQueue的实现如ArrayDequeMap的实现如HashMapTreeMapHashTable。他们有各自的底层实现和不同的特点。今天开始,我们进入java集合框架的新篇——Set,先看一下jdk对Set的定义是什么翻译:不包含重复元素的集合。更正式地说,集合不包含e1.equals(e2)这样的元素对e1和e2,最多包含一个空元素。从Set的定义我们了解到Set集合中的元素。原创 2023-03-28 13:25:52 · 280 阅读 · 0 评论 -
java源码阅读 - HashTable
从源码层面深度解析HashTable原创 2023-03-27 23:49:33 · 578 阅读 · 0 评论 -
java源码阅读 - LinkedHashMap
通过源码对LinkedHashMap详细分析原创 2023-03-26 00:12:41 · 689 阅读 · 0 评论 -
java源码阅读 - TreeMap
在上一篇文章中,我们介绍了java集合框架中的Map一族的HashMap源码解读,从中得知在HashMap中各个键值对的存储是无序的,导致我们在遍历它的时候无法得到一个有序的键值对集合。所以本文章给大家带来Map的另一个实现TreeMap,从使用上来看,TreeMap中的键值对是有序的;从底层实现来看,TreeMap是由红黑树实现的。这两点是TreeMap与HashMap最大的区别。同时也正因为TreeMap底层是由红黑树实现的,所以他是有序的。原创 2023-03-23 15:23:17 · 1063 阅读 · 0 评论 -
java源码阅读 - HashMap
往期文章用最简单的话讲最明白的红黑树java源码阅读 - ArrayDequejava源码阅读 - LinkedList(附动图说明)文章目录往期文章一、介绍二、类的声明三、底层实现四、内部类Node与TreeNode五、成员变量六、构造方法七、hash()方法八、comparableClassFor()方法九、tableSizeFor()方法十、扩容原理1.确认新的容量和阈值2.将原数组中的数据放在新数组中3.对红黑树的处理4.通过图例理解扩容细节5.如何判断出下标是否变化十一、putVal(原创 2023-03-15 09:36:35 · 247 阅读 · 0 评论 -
HashMap中putAll()方法批量保存的源码解读,并发现严重缺陷
本文通过源码分析HashMap中批量保存数据的方法putAll(),在分析中发现严重缺陷,一起看看吧原创 2023-03-14 11:40:28 · 805 阅读 · 1 评论 -
HashMap中put()方法源码解读
HashMap中put()方法源码解读,全网我最细原创 2023-03-13 13:25:02 · 229 阅读 · 0 评论 -
HashMap扩容原理,全网我最细
的策略,就是说实例化HashMap对象时,其实并没有立即对底层结构实例化,底层数组依然为空,因此当我们首次像该HashMap对象中put数据时,才会通过扩容来创建底层数组的实例。这时如果原阈值大于0,说明该原阈值目前只是暂时表示数组长度,就回到了上面的问题了,只需要将该原阈值作为新数组容量就可以了。遍历到原数组的下标为1的节点X,发现该位置仅有一个节点X,不存在链表和红黑树,如下图所示。————————————————我是万万岁,我们下期再见————————————————原创 2023-03-11 08:42:44 · 490 阅读 · 0 评论 -
HashMap中的tableSizeFor()方法是如何确定容量的
本文介绍HashMap是如何确定其容量的原创 2023-03-10 10:34:28 · 215 阅读 · 0 评论 -
HashMap中的hash()方法是如何解决哈希冲突的
通过源码深度解析HashMap中hash()方法是如何解决哈希冲突的原创 2023-03-09 10:37:36 · 222 阅读 · 0 评论 -
java源码阅读 - ArrayDeque
本篇文章从源码深度解析以循环队列实现的双端队列ArrayDeque原创 2023-02-21 15:47:21 · 200 阅读 · 0 评论 -
java源码阅读 - PriorityQueue
本文以源码为主深度解析java集合集合中的优先级队列PriorityQueue原创 2023-02-16 16:29:22 · 204 阅读 · 0 评论 -
java集合之Vector
本文通过与ArrayList源码的对比,学习Vector原创 2023-02-13 17:11:29 · 297 阅读 · 0 评论 -
java源码阅读 - LinkedList(附动图说明)
本文通过使用动图详细讲解LinkedList基本操作的每一行代码,让你不会也会原创 2022-11-14 22:34:57 · 502 阅读 · 0 评论 -
ArrayList源码阅读
从头到尾手撕ArrayList源码原创 2022-08-18 01:04:58 · 461 阅读 · 0 评论