自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

繁茂的博客

Java与大数据成长记

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

原创 JDK成长记21: ReentrantLock (4) 公平、非公平、可重入锁是什么?

经过前面的三节,相信你对ReentrantLock底层的AQS原理已经很清楚了。接下来给大家介绍几个ReentrantLock中的几个概念:公平,非公平锁的概念ReentrantLock是如何实现非公平和公平的?可重入锁又是什么东西?公平锁 Vs 非公平锁 公平锁 Vs 非公平锁当你掌握了ReentrantLock加锁,加锁失败入队,释放锁的原理后。其实在ReenrantLock中还需要搞明白几个概念,比如独占锁、共享锁、可重入锁,公平锁和非公平锁这些都是什么意思。这一小节,我们先来.

2021-11-17 10:39:18 344

原创 JDK成长记20: ReenranctLock(3)释放锁的AQS底层原理

前两节你应该掌握了ReentrantLock加锁成功和加锁失败入队的核心逻辑,是如何通过AQS中的3个组件做到的。今天来我们看下:ReentrantLock中,当线程释放锁时的逻辑释放锁的过程及源码剖析 释放锁的过程及源码剖析 目前经过线程1、线程2使用ReentrantLock.lock()后的结果如下: 线程2入队等待,线程1持有锁,state=1,owner是线程1,队列中元素是线程2,队列是由Node节点组成的双向链表,头结点为空,队列具体情况如下: 此时假设线程1调用了u.

2021-10-29 21:17:03 169

原创 JDK成长记19:ReenranctLock(2)加锁入队的AQS底层原理

上一节,你应该学到了ReentrantLock底层基于AQS的3个小组件 state、owner、queue。并且了解了下一个线程1进行加锁修改owner和state的过程。还记得么?加锁成功后,如下图所示的状态:首次加锁的时候,只使用到了owner和state这两个小组件,并没有涉及到等待队列。所以这一节,我们继续看一下,如果有下一个线程—线程2,这个哥们过来加锁会是如何的?直接从JDK源码层面理解AQS的另一个线程也来加锁的入队逻辑直接从JDK源码层面理解AQS的另一个线程也来加锁的入队逻辑.

2021-10-29 19:45:10 250 1

原创 JDK成长记18: ReentrantLock (1) 通过首次加锁初识AQS

上一章你应该掌握了Atomic的底层原理-CAS。接下来进入另一个重要的一个知识AQS。我们通过ReentrantLock这个类来讲讲AQS这个知识。从上图可以看出,ReentractLock、ReadWriteReentractLock,这些锁API底层是基于AQS+CAS+volatile来实现的,一般不会直接使用,常使用的是一些并发集合API,但是它们的底层大多还是基于ReentrantLock或者AQS来实现的。ReentrantLock属于java并发包里的底层的API,专门支撑各种jav.

2021-10-27 10:02:28 179

原创 JDK成长记17:Atomic类的原理—CAS+valotile

经过volatile和synchronize关键字的底层原理的洗礼,不知道你是否有一种感觉,要想弄明白它们的原理是一个非常难的过程。为什么费这么大的力气要弄明白这些并发基础知识呢?其实是为了之后更好的掌握并发组件、并发集合这些内容。JDK中的juc(并发包)的知识大体可以分为如下几块:并发基础中除了volatile、synchronied、线程状态变化之外,还有很重要的两个知识CAS和AQS。而其他并发组件和集合都是基于这些知识来实现的工具而已。这一节我们通过Atomic类来学习下它的底层原理,实.

2021-10-23 22:14:46 309

原创 JDK成长记16:从0分析你不知道的synchronized底层原理(下)

上一节你了解了什么是CAS、synchronized形成的锁的类型、重量级锁是用户态进程向内核态申请资源加锁过程,HotSpot Java对象结构,以及初步从3个层面分析了下synchronized的核心流程。还记得核心流程图么?如下所示: 这一节我们仔细来分析下这个过程中,每一步的底层原理。我们需要用到一个工具包,JOL,它可以将java对象的信息打印出来。你可以通过这个工具分析升级过程中锁的标记变化。synchronized锁升级流程详解 synchronized锁升级流.

2021-10-22 18:15:30 207

原创 JDK成长记15:从0分析你不知道的synchronized底层原理(上)

前几节你应该已经了解和掌握了Thread、ThreadLocal、Volatile这几个并发基础知识的底层原理。这一节,你可以跟我一起深入了解下synchronized关键字的底层原理和其涉及的基础知识。看完这篇成长记,你可以获取到如下几点:synchronized预备知识:理解什么是CAS?synchronized会形成几种锁的类型HotspotJVM虚拟机Java对象内存中的布局结构是什么,markword是锁的关键字段?操作系统中用户态和内核态的资源操作和进程是什么意思? synch.

2021-10-22 15:44:41 211

原创 JDK成长记14:(深度好文)你能从3个层面分析volatile底层原理么?(下)

上一节我们基本了解Volatile的作用,从JMM层面简单分析了下volatile可见性的实现要求。发现JMM设定了一些操作要求,在这些要求下,可以保证线程间的可见性。可是具体实现是怎么实现的呢?但是你要想理解这个实现是比较难的,之前提到按照三个层面给大家讲解。如下图所示:其实上一节通过JMM分析volatile是归于JVM层面分析的一部分而已。你要想完全弄清楚volatile的可见性和有序性,你还要继续分析字节码层面的JVM指令标记是什么?Hotspot实现的JSR内存屏障是什么意思?最终实现..

2021-10-21 09:38:48 208

原创 JDK成长记13:(深度好文)你能从3个层面分析volatile底层原理么?(上)

前几节你应该学习到了Thread和ThreadLocal的底层原理,在接下来的几节中,让我们一起来探索volatile底层原理吧!不知道你有没有这样的感受:有很多工程师都很难说清楚volatile这个关键字的作用或者原理。比如有的人压根不知道volatile的作用、应用场景;比如有的人也不知道什么是有序性,可见性,原子性,比如有的人可能能说上来它的作用是什么“保证有序性,可见性,无法保证原子性。”但是大多数人很难说清楚为什么能保证有序性,可见性,不能保证原子性;比如在面试的时候,你经常被面试官问到vol.

2021-10-21 09:36:36 149 1

原创 JDK成长记12:ThreadLocal (下)

上一节你弄懂了ThreadLocal是什么、它的基本使用方式、get方法的底层原理。这一节让继续深入研究下:ThreadLocal的set源码原理JVM的中的强引用、弱引用、软引用、虚引用弱引用在ThreadLocal的应用ThreadLocal内存泄漏问题分析ThreadLocal应用场景举例ThreadLocal set方法源码原理 ThreadLocal set方法源码原理你有了阅读threadLocal的get方法的经验,set方法的源码会变得非常简单。set源码如下所示:.

2021-10-21 08:48:45 138

原创 JDK成长记11:ThreadLocal (上)

上一节你应该学习了thread的基本知识和源码原理,熟悉了线程的应用场景。这一节来学习下和Thread相关的一个类,ThreadLocal。什么是ThreadLocal? 什么是ThreadLocal?字面意思是线程本地变量的意思。用一句话解释就是:线程本地的变量副本,属于每个线程自己独有的。为什么说是变量副本呢?因为每个线程使用ThreadLocal设置自己的值,设置的值互相之间不受影响,但是使用的是同一个ThreadLocal对象。所以设置的每个变量,是给每个线程一个独有的变量副本。你可.

2021-10-20 23:26:33 147

原创 我的成长记1:手把手教你如何画出令人称赞的图(程序员必读)

画一张好图的意义?作为程序员的你,你经常做的除了起给变量和类起名字、另一就是画图了。抛开起名字这个令人头疼的问题,画图对我们来说是一个表达想法非常不错的方法。因为画图可以清晰的表述你的思维框架,帮你梳理逻辑,更好的传达信息。有的人跟我说画图是一项费时费力的活,的确是这样。但是你要换一个思路想想,为什么会费时费力呢?因为你的大脑在组织你用语言所表达的东西,而且你要思考如何表达才能简单、清晰。如果你只是胡乱涂鸦,那肯定不会费事的,是不是?那么,知道了这一点,其实你会发现,如果你画了几张高质量的图,能清.

2021-10-20 21:15:00 162

原创 JDK成长记10:Thread的基本原理和常见应用场景,你都知道么?

相信你经过集合篇的成长,已经对JDK源码的学习轻车熟路了。接下来你将一起和我进入后半篇的学习。让我们开始吧! 在接下来10分钟,你将学习到thread 的源码原理、线程的状态变化、线程的常用场景。Thread基础回顾Thread基础回顾什么是Thread?Thread顾名思义,是线程。你应该知道,一个java程序在操作系统上运行,会启动一个JVM进程,具有一个进程ID,这个进程可以创建很多个线程。操作系统、程序、进程、线程关系如下图所示:运行一个线程其实就是启动一个执行分支,执行不同的...

2021-10-19 12:00:20 227

原创 JDK成长记9:集合篇的总结和练习

这一节主要是抛出一些面试题让大家检验一下学习成果,也会小结一下集合篇的知识点。 所以不会特别长。练习-模拟面试 练习-模拟面试先给大家讲一个简单的面试场景快手Java面试一、二面:(一面一般会问一些各种基础,比如集合、并发、锁、JVM、MySql、Redis,IO模型,网络模型等基本原理和知识。二面也会掺杂一些基础,还会有些项目相关、框架的原理,中间件的原理,一些架构和思想,三面也是多方面的,但是基础会少,一般是一些底层原理,系统设计或者架构等)面试官:你好候选人:你好大家寒暄一下…….

2021-10-19 10:16:28 113

原创 JDK成长记8:HashMap的兄弟姐妹们

LinkedHashMap的源码底层原理LinkedHashMap的源码底层原理LinkedHashMap继承自HashMap,但是它的底层增加了一个链表来维护插入或者访问顺序,使得LinkedHashMap变动有顺序性。如下图所示:上图中可以看出,LinkedHashMap继承了HashMap,多了两个成员变量,tail和head指针,还使用Entry内部类继承了HashMap的Node内部类,在原有基础上增加了before和after指针。默认情况下,是按照插入顺序的,也就是put的顺序。.

2021-10-18 21:49:12 123

原创 JDK成长记7:3张图搞懂HashMap底层原理!

HashMap基本原理和优缺点HashMap基本原理和优缺点一句话讲, HashMap底层数据结构,JDK1.7数组+单向链表、JDK1.8数组+单向链表+红黑树。HashMap的3个底层原理HashMap的3个底层原理在看过了ArrayList、LinkedList的底层源码后,相信你对阅读JDK源码已经轻车熟路了。除了List很多时候你使用最多的还有Map和Set。接下来我将用三张图和你一起来探索下HashMap的底层核心原理到底有哪些?这一节我们就不一步一步带着大家看源码,直接通过3.

2021-10-18 21:45:12 214

原创 # JDK成长记6:你了解LinkedList的五脏六腑么?

上一节你看过了LinkedList的add方法源码,是不是已经打开了思路呢?其实核心原理就是辅助指针+Node双向链表数据结构而已。相信经过前面的学习,你应该热身完毕了,之后的学习可以让我们可以加快速度了。GO!GO!这一节你还需要深入LinkedList的其他方法探索下它们的底层原理是什么。学完这一节,你可以自己写出一个LinkedList,甚至可以举一反三写出单向链表的List,逆转一个单向链表等等。你也可以攻克很多链表的算法题。面试问到ArrayList和LinkedList的时候,相信你..

2021-10-17 22:19:57 106

原创 JDK成长记5:LinkedList初探

LinkedList初探LinkedList初探作为Java工程师,LinkedList你可能用的不多,大多你总是在new ArrayList。面试很多时候总是拿LinkedList和ArrayList的做对比。总会问你ArrayList 和 LinkedList 的区别是什么?它俩是不是线程安全的?等等。很多时候你的习惯了使用ArrayList,都很少考虑使用LinkedList。你可能都不知道他可以用作内存队列或者栈。再接下来的几节中,你就可以学习到LinkedList的底层各种源码的原理,练..

2021-10-17 22:16:04 144

原创 JDK成长记4:ArrayList常用方法源码探索(下)

写在前面的话写在前面的话有的同学问我,开始讲的很基础,节奏比较慢,这个是因为一个为了让大家慢慢进入状态,后面的节奏会越来越快的,大家不要着急,另一个是因为简单的东西重复,温故而知新,更希望给你们带来的是思想和观念的成长,这个需要铺垫。这个有点像练武功,要想练就高深的武功,需要循序渐进,不然很容易走火入魔的,所以要把根基打扎实,不能着急。这里剧透下,后面会给大家带来一个一个绝世功法:《HDFS成长记》、《ZK成长记》、《Spring Cloud Alibaba成长记》、《Spring Cloud 成长.

2021-10-16 13:27:47 155

原创 JDK成长记3:ArrayList常用方法源码探索(中)

无论是程序员的工作、学习,还是生活中的事情。都可以遵循这样一条原则:“,简单的事情重复做,正确的事情重复做。” 这样的努力会让你走到正道上,少走很多弯路。从小司机变成老司机。上一节你应该已经掌握了ArrayList的扩容原理,System.arrayCopy方法,还有看源码的一些思想和方法。这一节更多的是练习一下学到的思想和方法,带你快速摸一下ArrayList其他常用方法的源码原理,看看他们里面的一些亮点,这一节还可以让你简单了解下fail-fast机制,之前的modCount到底是干什么的。轻车..

2021-10-16 13:18:46 146

原创 JDK成长记2:ArrayList常用方法源码探索(上)

上一节相信你不光学会ArrayList构造函数的知识,更学会了先脉络后细节、连蒙带猜的思想。在之后的几节中,你将学会ArrayList常用方法的源码原理。学完之后,你将不会再被ArrayList的面试题问倒了,更可以得心应手的使用ArrayList。今天这一节,你主要可以学到以下几点:ArrayList扩容原理影响ArrayList性能的根本原因是什么学会新的源码阅读思想和方法让我们开始吧!ArrayList第一次调用add方法发生了什么?首先你要修改下上一节之前的Demo,修改如...

2021-10-15 16:40:06 133

原创 JDK成长记1:天呐!学完这个成长记,再面试100次也不用再愁Java基础知识了!

为了让广大工程师们更好的提升个人技术能力和思想,我将开通一个大专栏《成长记》系列,会包含Java架构和大数据从底层技术到源码原理的分享,敬请关注! 无论作为Java程序员还是大数据工程师的你,工作时间久了,可能很多底层和基础技术已经还给你的大学老师或者80%已经丢在脑后了。比如你可能已经不记得网络模型有几层?TCP三次握手,四次挥手的流程你可能也说不上来了?JDK集合和并发包的源码你可能压根没有看过,又或者很早之前你看过,但不记得了。甚至并发包下很多东西都没有用过。你也可能正在准备跳槽或者面试,...

2021-10-15 16:07:29 185 1

原创 Kafka成长记9:Kafka内存缓冲区中的消息最终如何发送出去的?

之前三节我们主要分析了KafkaProducer是如何将消息放入到内存缓冲区的。上面的逻辑只是Accumulator.append()的一段核心逻辑而已,还记得之前我们分析过的KafkaProducerHelloWorld的整体逻辑么?之前分析的代码逻辑如下图所示:从最开始配置解析,消息对象Record的创建,到元数据拉取、key和value的最初序列化、Product分区路由的原理、消息如何放入内存缓冲区的原理。之前我们已经分析到了图中红线的部分的结尾了—唤醒Sender线程发送消息。这一.

2021-10-11 22:24:54 444

原创 Kakfa成长记8:Producer如何将消息放入到内存缓冲区(下)

上一节我们主要分析了RecordAccumulator通过BufferPool申请内存的源码原理,在之前的分析中,在KafkaProducer发送消息时,把消息放入内存缓冲区中主要分为了三步。如下:而且之前我们主要分析了前两步的代码,如下注释所示: public RecordAppendResult append(TopicPartition tp, long timestamp, .

2021-10-09 21:58:52 198

原创 Kafka成长记7:Producer如何将消息放入到内存缓冲区(中)

上一节我们分析到如何将消息放入内存缓冲器主要分三步,如下图所示:我们重点分析了getOrCreateDeque()方法,它主要创建了如下数据结构,如下所示:这一节我们继续向下分析,看看如何通过BufferPool申请内存空间NIO的多块内存ByteBuffer的。BufferPool的创建内存缓冲区,分配内存的逻辑代码主要如下所示:private final BufferPool free;public RecordAppendResult append(TopicPartition t.

2021-10-09 21:57:14 430

原创 Kafka成长记6:Producer如何将消息放入到内存缓冲区(上)

之前我们分析了Producer的配置解析、组件分析、拉取元数据、消息的初步序列化方式、消息的路由策略。如下图:这一节我们继续分析发送消息的内存缓冲器原理—RecordAccumulator.append()。如何将消息放入内存缓冲器的?在doSend中的,拉取元数据、消息的初步序列化方式、消息的路由策略之后就是accumulator.append()。如下代码所示:(去除了多余的日志和异常处理,截取了核心代码) private Future<RecordMetadata> doSe.

2021-10-07 13:38:39 226

原创 Kafka成长记5:Producer 消息的初步序列化和分区路由源码原理

Kafka成长记的前4节我们通过KafkaProducerHelloWorld分析了Producer配置解析、组件组成、元数据拉取原理。但KafkaProducerHelloWorld发送消息的代码并没有分析完,我们分析了如到了如下图所示的位置:接下来,我们继续往下分析,这一节我们主要分析下发送消息的初步序列化和分区路由源码原理。自定义消息的初步序列化的方式在producer.send()执行doSend()的时候,waitOnMetadata拉取元数据成功之后脉络是什么呢?private F.

2021-10-07 08:46:18 285

原创 Kafka成长记4:Producer 元数据拉取源码原理(下)

上一节结尾,我们总结道: 初始化KafkaProducer时并没有去拉取元数据,但是创建了Selector组件,启动了Sender线程,select阻塞等待请求响应。由于还没有发送任何请求,所以初始化时并没有去真正拉取元数据。 真正拉取元数据是在第一次send方法调用时,会唤醒唤醒Selector之前阻塞的select(),进入第二次while循环,从而发送拉取元数据请求,并且通过Obejct.wait的机制等待60s,等到从Broker拉取元数据成功后,才会继续执行真正的生产消息的请求,否则会报拉取.

2021-10-06 09:36:54 322

原创 Kafka成长3:Producer 元数据拉取源码原理(上)

上一节我们分析了Producer的核心组件,我们得到了一张关键的组件图。你还记得么?简单概括下上面的图就是:创建了Metadata组件,内部通过Cluster维护元数据初始化了发送消息的内存缓冲器RecordAccumulator创建了NetworkClient,内部最重要的是创建了NIO的Selector组件启动了一个Sender线程,Sender引用了上面的所有组件,开始执行run方法。图的最下方可以看到,上一节截止到了run方法的执行,这一节我们首先会看看run方法核心脉络做了什么。接.

2021-10-06 08:28:28 325

原创 Kafka成长记1:从HelloWorld开始研究Kafka Producer源码原理

成长记不会介绍太对一些kafka的基础知识,如果有需要的话,之后会有专门的《小白起步营》。成长记的默认大家对kafka的一些概念是熟知的、默认也是会基本Kafka的部署的。当然为了照顾一些小白,第一次涉及的知识我会简单介绍和解释的,熟悉的人就当回顾吧。简单的事情重复做有时也是好事。Kafka成长记会直接从三个方面开始探索,Producer、Broker、Comsumer。过程中,根据场景会使用之前ZK和JDK成长记介绍源码分析方法。话不多说,让我们直接开始第一节的内容吧!我们之前研究ZK主要是使用的场.

2021-09-29 10:03:50 290

原创 Kafka成长记2:Producer核心组件分析

上一节我们主要从HelloWorld开始,分析了Kafka Producer的创建,重点分析了如何解析生产者配置的源码原理。 public KafkaProducer(Properties properties) { this(new ProducerConfig(properties), null, null); }Kafka Producer的创建除了配置解析,还有关键的一步就是调用了一个重载的构造函数。这一节我们就来看下它主要做了什么。KafkaProducer.

2021-09-29 09:54:49 418

原创 SpringBoot成长记11:SpringBoot完结总结

前面10节的回顾通过前面10节SpringBoot成长记的分析,你应该对SpringBoot的原理和设计思想有了很清晰的认识了。最后这一节呢,我们将之前每一节最重要的知识点,提取出来一个总结。第一节成长记1:你真的懂SpringBoot吗?我们通过去官方文档寻找SpringBoot核心功能,教给大家两个思想,先脉络后细节的思想和注重思考的思想。我自己对SpringBoot功能的思考:SpringBoot定义了新的web应用启动流程、SpringBoot核解决了Spring集成各种技术的复杂性。.

2021-09-28 08:54:10 186

原创 SpringBoot成长记10:Bean实例化的流程和设计

之前我们已经分析SpringBoot在run方法时,它会执行的refresh()容器的操作。在SpringBoot中,refresh()有十几个方法,每个方法的大重要程度是不一样的,我们通过抓大放小的方式,分析处理上图3个核心逻辑。并且已经研究完了invokeBeanFactoryPostProcessors和onRefresh的逻辑,分析它们的原理和设计思想。之前主要分析的:原理有对SpringBoot的自动装配配置如何做到的、第三方技术如何进行扩展的、tomcat如何启动的设计思想有Spr.

2021-09-28 08:51:52 296

原创 SpringBoot成长记9:onRefresh如何启动内嵌的Tomcat容器的?

上一节我们主要分析了refreshContext中,主要有3个逻辑,如下图:上一节重点解析了invokeBeanFactoryPostProcessors执行容器扩展点,实现了自动装备配置、第三方执行扩展的执行。今天我们继续分析refreshContext另一个重要的逻辑onRefresh()逻辑,让我们开始吧!快速概览: onRefresh启动内嵌tomcat前的操作refreshContext中onRefresh之前还有一些逻辑,我们先来快速看下它们主要做了什么。首先来看下代码: @.

2021-09-28 08:47:13 431

原创 SpringBoot成长记8:SpringBoot实现自动装配配置,第三方功能的扩展之处

前面我们摸清楚了整个invokeBeanFactoryPostProcessors方法的if-else逻辑和3个for循环的核心脉络逻辑。接下来我们来看下细节,我会通过抓大放小的思想,带大家看到在扩展点执行的过程中,最最要的有哪一些。SpringBoot的自动装配配置如何做到的、第三方技术如何进行扩展的。SpringBoot的自动装配配置如何做到的?if-else逻辑中哪些BeanFactoryPostProcessor执行了?之前我们提到过,invokeBeanFactoryPostProce.

2021-09-28 08:22:00 544

原创 SpringBoot成长记7:容器的扩展操作是如何执行的

目前我们分析的代码已经到了容器处理相关的SpringBoot原理,代码如下:public ConfigurableApplicationContext run(String... args) { //DONE 扩展点 SpringApplicationRunListeners listeners.starting(); //DONE 配置文件的处理和抽象封装 ConfigurableEnvironment //容器相关处理 //1)核心就是创建了Context和BeanFac.

2021-09-28 08:03:09 167

原创 SpringBoot成长记6:准备SpringContext容器

上一节的创建了容器对象,核心就是创建了Context和BeanFactory对象,内部初始化了Reader和Scanner,加载了一些内部Bean等。已经分析的逻辑代码如下:public ConfigurableApplicationContext run(String... args) { //DONE 扩展点 SpringApplicationRunListeners listeners.starting(); //DONE 配置文件的处理和抽象封装 ConfigurableEnvi.

2021-09-28 07:56:06 205

原创 SpringBoot成长记5:Spring容器的创建

前面你熟悉了SpringBoot的扩展点SpringApplicationRunListeners的设计,配置文件ConfigurableEnvironment的抽象封装。其实这些都还不是它最核心的,最最核心的时Spring的容器的创建和准备,自动配置的装配,tomcat的容器的启动。这一节我们就来开始研究Spring的容器相关的逻辑,看看它有什么抽象的设计和扩展点,又主要做了哪一些事情呢?public ConfigurableApplicationContext run(String... args.

2021-09-28 07:48:40 433

原创 SpringBoot成长记4:Run方法中配置文件的处理

上一节,我们主要了解了SpringBoot的一个扩展点设计SpringApplicationRunListeners。并没有找到我们想要找到的Spring容器创建和web容器启动、自动装配配置的这些核心功能。 之前我们说过,xxxxEnvironment表示了配置文件的封装,这一节就让我们来看下,SpringBoot启动过程中,如何通过处理配置文件,设置到Environment对象中的。我们接着往下继续分析run方法,会看到如下代码:public ConfigurableApplicationCo.

2021-09-28 07:46:18 270

原创 SpringBoot成长记3:扩展点之SpringApplicationRunListeners

上一节我们熟悉了SpringApplication的创建和run方法的脉络。这一节就来先分析下脉络的中第一个比较有意思的扩展点—SpringApplicationRunListeners。如下:SpringApplicationRunListeners在run方法中位置在之前的run方法中,很多容器(context)相关的方法,配置(Environment)相关的方法,SpringApplicationRunListeners的代码比较分散。之前我们说过要抓大放小,我们分析SpringAppli.

2021-09-28 07:41:26 304

空空如也

空空如也

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

TA关注的人

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