自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

流的博客

spring全家桶/分布式/hadoop生态

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

原创 SpringBoot源码之Bean的生命周期

1.调用InstantiationAwareBeanPostProcessor# postProcessBeforeInstantiation。6.调用BeanPostProcessor的初始化前置方法。8.调用BeanPostProcessor的初始化后置方法。,后调用init-method方法,进行初始化操作。跟进initializeBean()跟进doCreateBean()跟进populateBean()5.设置Aware接口的属性。2.创建bean实例。4.注入bean属性。

2023-04-12 22:05:19 798

原创 Spring Boot2.0版本源码(十):Spring Boot的Start的解析之starter原理解析

之前的章节中讲过Spring Boot2.0版本源码(九):Spring Boot的Servlet容器Tomcat工厂类的加载,这个章节中有讲解@EnableAutoConfiguration注解实现对starter的自动注入的过程,会在在AutoConfigurationImportSelector类的getAutoConfigurationEntry()方法内执行解析@EnableAutoCo...

2020-04-30 15:01:01 492

原创 Spring Boot2.0版本源码(十):Spring Boot的Start的解析之自定义starter

start是一个可插拔的插件,如果是直接引入一个jar,还需要将jar中的数据注入到spring boot当中才可以使用,springboot starer可以自定注入下面我们就自定义一个starter...

2020-04-30 14:18:33 638

原创 Spring Boot2.0版本源码(十):Spring Boot的Start的解析之@Conditional注解

@Conditional注解是根据我们的条件来判断是否需要注入某个bean@ConditionalOnBean表示是否存在某个bean@ConditionalOnMissingBean表示不存在bean@ConditionalOnClass表示是否存在某个类@ConditionalOnMissingClass表示不存在某个类@ConditionalOnWebApplication表示是...

2020-04-29 16:03:09 342

原创 Spring Boot2.0版本源码(九):Spring Boot的Servlet容器个性化参数配置原理

我们可以在application.properties文件中写入server.port=9000使得我们的tomcat容器启动的时候,会在9000端口。我们之前讲解bean的注入的过程中Spring Boot2.0版本源码(五):Spring Boot的Bean的解析之bean的实例化过程讲解过,我们会调用AbstractAutowireCapableBeanFactory的applyBean...

2020-04-28 21:00:16 228

原创 Spring Boot2.0版本源码(九):Spring Boot的Servlet容器Tomcat工厂类的加载

11

2020-04-27 19:16:59 366

原创 Spring Boot2.0版本源码(九):Spring Boot的Servlet容器启动解析整体流程

下面是tomcat的容器架构tomcat处理请求

2020-04-24 14:49:10 270

原创 Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之核心方法

在上一篇博客Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之整体流程,我们知道里面解析各种注解使用的是ConfigurationClassParser解析器的parse(candidates)这个方法,完成对待处理的各种注解进行处理。/** * Apply processing and build a complete {@link Configur...

2020-04-23 16:27:56 275

原创 Spring Boot2.0版本源码(八):Spring Boot的注解的解析出Bean之整体流程

里面有一个BeanDefinitionRegistryPostProcessor的实现类ConfigurationClassPostProcessor,它的postProcessBeanDefinitionRegistry()方法如下,其调用了processConfigBeanDefinitions()方法进入该方法 /** * Build and validate a configu...

2020-04-23 10:53:09 369

原创 Spring Boot2.0版本源码(七):Spring Boot的属性配置解析

使用:指定配置文件配置文件中配置属性实现CommandLineRunner, EnvironmentAware接口即可运行程序,打印环境属性:下面是常见的spring ware

2020-04-22 15:33:03 533 2

原创 Spring Boot2.0版本源码(六):Spring Boot的启动加载器

自定义启动加载器实现ApplicationRunner接口,重写run()方法即可SpringApplication.run()方法中有一个callRunners(context, applicationArguments);就是在springboot运行时调用启动加载器的地方/** * Run the Spring application, creating and refreshi...

2020-04-21 20:37:30 199

原创 Spring Boot2.0版本源码(五):Spring Boot的Bean的解析之bean的实例化过程

大致介绍了一下bean实例化重要步骤:/** * Return an instance, which may be shared or independent, of the specified bean. * @param name the name of the bean to retrieve * @param requiredType the required type of...

2020-04-21 15:58:15 384

原创 Spring Boot2.0版本源码(四):Spring Boot的Bean的解析之refresh()方法

1. IOC思想使用一个IOC去管理抽象bean的初始化,下面就是用一个@autowired注解完成animal的初始化,他可能是Dog也可能是Cat,我们无需关心它使用的是哪一个实现。以此降低类之间的耦合性。下面是注入bean的五种方式2. refresh()方法看到SpringApplication的run()方法中会使用调用refreshContext(context);实现re...

2020-04-21 14:57:21 421

原创 Spring Boot2.0版本源码(三):Spring Boot监听器的实现

1. 介绍监听器的组成部分springboot的监听器都是通过ApplicationListener实现的类完成对监听事件的处理的,看得出来,所有的监听事件都是ApplicationEventApplicationEventMulticaster就是管理这些监听器的多播器,里面用一个集合存储了所有的ApplicationListener的实现类,可以实现增加一个监听器,删除一个监听器,和执行...

2020-04-20 14:51:06 648

原创 Spring Boot2.0版本源码(二):Spring Boot初始化器

1. 系统初始化器通过ApplicationContextInitializer类可以实现在springboot容器刷新之前注册属性2. 演示FirstInitializer类实现ApplicationContextInitializer接口,重写其中的initialize方法,可以通过下面的代码,向springboot中注入map.put("key1", "value1");这样的键值对...

2020-04-20 12:06:13 402

原创 Spring Boot2.0版本源码(一):Spring Boot启动整体流程预览

1. 项目启动1.框架初始化,也就是new Application()的过程2.框架启动,也就是new Application(),run()方法执行3.自动装配2.框架初始化1.配置资源加载器:用于加载resource等文件2.配置primarysources:一般是启动类3.环境监测:一般分为三种环境,标准环境、web环境、active环境(springboot2特性)3. ...

2020-04-18 16:24:12 271

原创 Netty源码(十五):Recycler工具类

1. Recycler工具类的使用Recycler为了避免我们重复的创建对象,使用对象池将我们使用过的数据保存起来,下一次就可以拿出来使用public class TestRecycler { // 对象池 private static final Recycler<User> RECYCLER = new Recycler<User>() { ...

2020-04-17 13:22:55 277

原创 Netty源码(十四):FastThreadLocal工具类

1. 写一个程序来验证FastThreadLocal功能public class TestFastThreadLocal { // FastThreadLocal初始化 public static FastThreadLocal<Object> fastThreadLocal1 = new FastThreadLocal<Object>(){ ...

2020-04-16 19:57:34 173

原创 Netty源码(十三):关闭服务

关闭流程:包括了bossGroup和workGroup的关闭开始源码,按照下面的方式完成操作,启动EchoServer1. 进入workerGroup.shutdownGracefully();不断跟进源码,进入到了SingleThreadEventExecutor的shutdownGracefully(long quietPeriod, long timeout, TimeUnit ...

2020-04-15 20:48:35 470 1

原创 Netty源码(十二):断开连接

1.正常关闭的逻辑关闭连接会进入read状态为了直接观察到关闭操作,我们注释上面的代码关闭最后也会进入到read事件里面1.allocHandle.lastBytesRead() <= 0这一行会发现数据小于零,释放byteBuf2.进入到closeOnRead(pipeline);完成关闭事件 @Override public final void re...

2020-04-15 19:15:31 849

原创 Netty源码(十一):写数据

write是把数据写入到一个buffer。flush就是将数据发出去。writeAndFlush就是写入数据立马发出去。下面是拿快递和写数据的对比:发送数据分为三部分:1.unflushedEntry所指向的entry,每次向链表中添加数据写到链表尾部2.写好一份完整的数据以后就将unflushedEntry这个头结点变成flushedEntry3.最后写入数据就是从flushe...

2020-04-15 16:36:40 414

原创 Netty源码(十):业务处理的过程pipeline

根据上一次接收数据逻辑的学习,可以总结下面的流程,红色就是我们学习的地方。pipeline,下面以inbound和outbound为例。pipeline本质就是一个链表,有head和tail,中间是很多个context,每个context中包含了需要执行的handler。可以看出inbound执行handle的顺序和outbound相反。打断点到EventLoop的读取数据的部分依然会...

2020-04-15 14:24:47 241

原创 Netty源码(九):接收数据

整体流程也是在EvenetLoop的run方法中select到了read事件,开始处理read事件。进入AbstractNioByteChannel类,调用其中的read方法 @Override public final void read() { final ChannelConfig config = config(); ...

2020-04-15 13:36:47 261

原创 Netty源码(八):建立连接请求的过程

在NioEventLoop中有一个run方法是处理接受请求的部分run方法循环监听事件,里面做了两件事情:1.select阻塞操作2.监听到事件以后处理事件// 死循环监听处理事件 @Override protected void run() { int selectCnt = 0; for (;;) { try {...

2020-04-14 21:15:53 588

原创 Netty源码(七):启动源码

1. 主线our thread就是我们自己写的netty服务器的主线程的代码2. 启动在下面三处打上断点2.1 selector初始化是在NioEventLoopGroup初始化运行程序:发现,查看NioEventLoopGroup通过创建一个子的NioEventLoopGroup,然后子的NioEventLoopGroup又NioEventLoop,并完成selector的创建...

2020-04-14 19:09:02 478

原创 Netty源码(六):Netty的内存

1. 内存分配方式可以通过下面代码实现内存分配是采用pooled还是unpooled方式,pooled可以增加对内存的使用反复使用下面试netty默认的内存分配方式不断跟进ByteBufAllocator.DEFAULT里面的代码,发现如下代码,可以看出内存的分配默认还是pooled的方式1.1 PooledDirectByteBuf对象池的使用...

2020-04-14 15:23:55 214

原创 Netty源码(五):keepalive和Idle处理

1.keepalive和Idle检测keepalive机制:如果对方突然无响应,我们需要发送一个探测帧去查看对方是是否下线。Idle检测:如果你发送数据给对方,对方无响应,你会等一段时间(Idle检测),如果对方无响应,你就会发送心跳包(Idle检测)2. 两种设置keepalive的方式下面两行代码都可以开启keepalive模式,keepalive模式默认是关闭的跟进childOp...

2020-04-13 20:12:09 1272

原创 Netty源码(四):Netty的“二次解码器”MessageToMessageDecoder

1. 二次解码器如果说封装成帧是一次解码器,那么二次解码器就是将byte流转化成java对象等。一次解码器和二次解码器的区别,区别一次解码器,而不是将两个两个解码器合二为一主要是因为考虑到分层的思想。如果有一天protobuf协议变成json协议,代码耦合度高,修改代码量大。2. ObjectEncoder如何实现编码的进入源码如图所示的包路径,第48行就是编码的核心方式,看得出来使用...

2020-04-13 15:53:59 1103

原创 Netty源码(三):Netty的粘包问题ByteToMessageDecoder

1. 产生粘包和半包的原因粘包产生的原因:两个包小于缓存区的大小,传送数据会将两个包都放在缓冲区中一起发送,就会产生粘包的问题。半包产生的原因:当某一个包的大于缓冲区的大小,会被发送多次,每次就收到的就是一个不完整的数据包。常见的处理手段:netty对不同粘包半包问题的支持类2. 问题一:Netty如何实现编码解码的查看ByteToMessageDecoder,该类是解码器的实现类...

2020-04-12 21:16:21 818

原创 Netty源码(二):三种Reactor模式

1. Reactor模型1.1 单线程reactor一个单线程去维护所有的acceptor、read、decode、compute、encode、send。1.2 多线程reactor模型我们认为decode、read、compute比较耗时,使用一个线程池去管理。1.3 主从多线程模型上面有两个reactor,因为所有事件里面acceptor最重要,用一个单独的reactor去...

2020-04-12 19:49:23 500

原创 Netty源码(一):OIO和NIO两种模式的切换方式

本项目源码使用的是netty4.11.修改IO模式对应的使用除了修改两个EventLoopGroup类型之外,我们想要修改IO模式,实现对OIO/NIO之间的切换只需要使用如下图所示的channel()方法。跟进channel()方法,我们发现IO模式切换使用的是一个ReflectiveChannelFactory()这个反射工厂实现的。跟进ReflectiveChannelFacto...

2020-04-09 20:01:01 771

原创 关于Actor模型,CSP模型,Reactor模型,Proactor模型

1. Actor模型传统的并发模型主要由两种实现的形式,一是同一个进程下,多个线程天然的共享内存,由程序对读写做同步控制(有锁或无锁). 二是多个进程通过进程间通讯或者内存映射实现数据的同步.Actors模型更多的使用消息机制来实现并发,目标是让开发者不再考虑线程这种东西,每个Actor最多同时只能进行一样工作,Actor内部可以有自己的变量和数据.在Actors模型中,每个Actor都有一...

2020-02-22 21:17:11 2241

原创 netty(九): 流量整形

1. 定义流量整形是为了控制当前服务的流量输出,保证下游节点的正常处理,如图所示,将流量洪峰放入队列中,使用令牌桶算法来保证流量不会突破输出极限,保证下游收到的数据都是平稳的。分为:1) GlobalTrafficShapingHandler:全局流量整形,放在服务器端,表示所有链接该服务器的channel整体的流量不超过阈值2)ChannelTrafficShapingHandler:...

2020-02-19 21:23:05 1965

原创 JVM(七):类加载器

类加载的机制的层次结构每个编写的”.java”拓展名类文件都存储着需要执行的程序逻辑,这些”.java”文件经过Java编译器编译成拓展名为”.class”的文件,”.class”文件中保存着Java代码经转换后的虚拟机指令,当需要使用某个类时,虚拟机将会加载它的”.class”文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载,这里我们需要了解一下类加载的...

2020-02-09 19:44:15 317

原创 JVM(六):JVM参数可视化工具和字节码技术

1.jconsole可视化工具从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可。...

2020-02-05 20:08:16 413

原创 JVM(五):Tomcat配置调优测试

用一个空的项目初始参数-XX:+PrintGCDetails -Xmx32M -Xms1M-XX:+HeapDumpOnOutOfMemoryError-XX:+UseSerialGC-XX:PermSize=32MGC 回收次数25次 吞吐量4662加大初始堆内存大小-Xms1M 修改为32mGC 回收次数7次 吞吐量5144扩大堆的最大内存为512M-XX:+Prin...

2020-02-05 17:42:50 130

原创 JVM(四):垃圾回收器

1.串行与并行收集器串行回收: JDK1.5前的默认算法 缺点是只有一个线程,执行垃圾回收时程序停止的时间比较长并行回收: 多个线程执行垃圾回收适合于吞吐量的系统,回收时系统会停止运行...

2020-02-04 20:16:03 206

原创 JVM(三):JVM参数配置和内存溢出

1.常见参数配置-XX:+PrintGC 每次触发GC的时候打印相关日志-XX:+UseSerialGC 串行回收-XX:+PrintGCDetails 更详细的GC日志-Xms 堆初始值-Xmx 堆最大可用值-Xmn 新生代堆最大可用值-XX:SurvivorRatio 用来...

2020-02-03 21:38:08 614

原创 JVM(二):垃圾回收机制

1.什么是垃圾回收机制不定时去堆内存中清理不可达对象。不可达的对象并不会马上就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,即使程序员能明确地判断出有一块内存已经无用了,是应该回收的,程序员也不能强制垃圾收集器回收该内存块。程序员唯一能做的就是通过调用System.gc 方法来"建议"执行垃圾收集器,但其是否可以执行,什么时候执行却都是不可知的。这也是垃圾收集器的最主...

2020-02-02 19:31:39 212

原创 JVM(一):java内存结构

java内存结构如下:1. Java堆(Java Heap)java堆是java虚拟机所管理的内存中最大的一块,是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。 java堆是垃圾收集器管理的主要区域,因此也被成为“GC堆”(Garbage Collected Heap)。...

2020-01-16 16:29:21 121

空空如也

空空如也

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

TA关注的人

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