自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringCloud配置动态更新原理解析

注:从SpringCloud配置动态更新的原理可知,诸如数据库连接配置,在配置中心修改了配置后只是会更新@RefreshScope注解Bean中的@Value属性,如果要动态修改数据库信息,则还需要重建DataSource对象、清除旧连接等操作。1、对于使用@Value注解获取配置的属性,不会随配置数据的更新而更新,因为Bean对象已经创建完成,配置变化时只是更新Environment中的数据,并没有更新Bean属性值的动作发生。这里的name变量值直接来自于Environment对象。

2025-01-12 18:26:56 370

原创 SPI和API,SpringBoot自动装配原理解析

SpringBoot的设计是基于Spring的,所以其实SpringBoot的启动流程包括的Spring的启动流程,SpringBoot在启动Spring(refresh方法)之前,提前做了spring.factories文件的解析,并把对应的类注册到了Spring容器中。对于纯Spring来说是不行的,因为这总得把druid中的那些类告诉Spring吧,xml中没配,包扫描的话druid的包又和我项目的包结构不一样,总之就是必须开发人员通过一种方式手动配置上druid的相关类。

2024-11-24 22:08:42 675

原创 Netty-TCP服务端开发解析

1、Java领域诸多大名鼎鼎的项目在网络通讯框架方面几乎都使用了netty,包括SpringCloudGateway、Dubbo、Zookeeper、Kafka、Spark、Hadoop、ElasticSearch、RocketMQ、gRpc等等。因为netty可靠性高、性能好、开发简单、功能丰富、bug修复及时。本篇对使用Netty开发TCP服务端的代码和工作原理做简要介绍。2、tcp服务端的io操作主要有:Listen:监听端口、accept:接收连接、read:读数据、write:写数据。

2024-09-17 18:32:07 2292 1

原创 线程池工作原理和参数调优

对于jdk的线程池,这是一个很容易理解错的参数,假如核心线程数为10,队列数为10,最大线程数为20,则当我们向线程池提交21个任务时,会先安排10个线程来执行前10个任务,第11至20个任务则会被放到阻塞队里暂存,当提交第21个任务时,由于核心数用尽、队列也用尽,此时会产生第11个线程,来执行第21个任务。那么如何让一个线程一直存活,并执行一个又一个的任务?核心线程数->阻塞队列->最大线程数都用尽了,再提交任务,就触发拒绝策略,常见的拒绝策略如抛异常、交给提交任务的线程去执行(任务变成同步了)等。

2024-08-04 23:51:54 1106

原创 BIO和NIO

显然,NIO编程难度远大于BIO,不仅需要熟悉非阻塞io、多路复用相关的api,还需要熟练掌握多线程,甚至可能需要解决应用层的问题,不像BIO每个连接有自己独立的线程,如果用NIO开发类似http这种请求响应类的协议,请求和响应的对应关系必须仔细设计一番。以tcp为例,主要的io操作包括建立连接、读、写,服务端监听一个端口,多个客户端可以来连接,同一个主机也可以通过多个端口来连接服务端,只要保证客户端的ip和端口不完全相同即可建立一条连接。,多路复用器执行select方法筛选出有io事件的socket,

2024-06-27 21:05:36 661

原创 Java应用内存区域

附:OOM的问题排查,在java应用启动时可以添加参数-XX:+HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath=来设置当应用出现OOM时自动生成内存快照,也可以在运行时使用jmap -dump:format=b,file= 命令来生成当前内存快照dump文件,使用工具 VisualVM或MAT分析dump文件可以看出在当时各类型对象的数量和大小,找到大对象等,从而推测出内存泄露的位置。6、直接内存:记得释放。

2024-06-16 17:43:27 669

原创 Java锁和分布式锁用法浅析

这里的num自增自减虽然在java层面只有一行代码,但是在cpu执行时其实是多个步骤,至少包括读取数值、计算加1、写回内存,而这中间便可能发生线程切换,例如:线程一读取了num的值为0,然后线程二也读取了num的值为0,线程一计算+1再写回内存值为1,线程二再计算-1然后写回内存值为-1,所以明明应该得到结果为0,但是这里得到的值却是-1,这里最本质的问题就是。的,即由一个线程来执行从外部传进来的诸多命令,一个命令一个命令排着执行,先到的先执行,后到的后执行。Java代码层面最简单的方法就是加锁,

2024-04-26 23:53:26 1171 3

原创 JDK动态代理用法简介

答案是自己想办法提供原始类的对象,图示中我自己new了一个原始类对象obj,然后在invoke方法中直接用反射调用,invoke方法的第二个参数method,就是对应的原始方法,第三个参数就是这个method的实参,这两个参数值都是在proxyInstance调用方法时才动态确定。c、一个InvocationHandler对象,我这里用了匿名内部类,当然可以专门单独写一个类。时,实际都是执行我们的InvocationHandler对象的invoke方法,这就相当于把原始的方法全都给替换了。

2024-04-15 15:06:53 391

原创 Spring启动流程解析

主要是准备工作,在后面执行BF后置的时候,我们会发现context有的属性莫名奇妙的已经有值了,比如beanFactory对象,那么他们的值很可能就是在这里产生的,但是SpringBoot的话是在context构造器中new出的beanFactory,这些逻辑根据context的类型不同而异,有些xml类的context在这里解析了xml并生成beanDefinition存入beanDefinitionMap中。,SpringBoot的tomcat是在这里启动的,端口在此正式监听。

2024-04-10 17:46:33 1004

原创 SpringBoot配置文件优先级解析

其实以上的优先级介绍并没有覆盖所有的配置文件类型和配置形式,譬如我们还可以在classpath的config目录中放一个application.yaml,这个文件的优先级应该在哪个位置呢?来自各个地方的配置,最终都存在了这个List中,所以我们会得到一个有序的配置文件列表,其中每一个元素对应一个配置文件。所以其实一共有几种类型的配置文件并不确定,我们可以自行增加,如果项目使用了配置中心,可以查看到其配置数据在List中的位置相对靠前,也就是为什么我们配置中心里的配置优先级高于jar包中的配置。

2024-02-15 23:37:00 2226

原创 Spring循环依赖源码解析

为什么会出现循环依赖?Spring怎样使用三级缓存解决循环依赖?为什么是三级缓存,只使用两级可以吗?

2024-01-24 14:22:27 1239

原创 Spring Bean的生命周期概要

Spring Bean的生命周期概要

2024-01-12 17:40:00 467 1

原创 SpringBoot启动refresh()流程概要

​​​​​​​。

2024-01-09 17:57:44 497

原创 SpringBoot启动流程概要

SpringBoot启动流程要点总结

2024-01-05 17:41:27 481

空空如也

空空如也

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

TA关注的人

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