自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

宇轩笔墨

新手小白参上,请多多指教

  • 博客(19)
  • 资源 (1)
  • 收藏
  • 关注

原创 springBoot-SpringBoot自定义starter

在一个空Maven项目中,新增和两个模块,xxxx是你这个starter是做什么的,模块主要是作依赖管理,外界使用我们自定义的starter只需要导入我们模块即可。自定义的模块,是我们编写自动注入的地方,需要引入了Spring的模块,这个模块在创建SpringBoot项目的时候会自动引入的,也是必须引入的,通过加载META-INF文件夹下的spring.factories文件完成自动配置的功能以及开箱即用的效果。

2024-03-05 16:01:33 575

原创 SpringBoot自动装配的原理

作用是Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;根据当前不同的条件判断,必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;在第6步的时候,只是注册了部分Bean,像 @Import @Bean等,是没有被注册的,这里统一对这些进行注册。解析配置类,可能是Full配置类,也有可能是Lite配置类,这个小方法是此方法的核心,稍后具体说明。

2024-02-29 11:06:34 817

原创 redis-Redis主从,哨兵和集群模式

然后,master再将之前缓存在内存中的命令发送给slave。​ 在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异 常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现 一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持 很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。

2024-02-27 09:44:29 1154

原创 JVM-JVM的垃圾回收机制

记忆集与卡表HotSpot虚拟机是用记忆集来记录某块内存区域是否包含跨代引用的对象。记忆集是抽象概念,而卡表是记忆集的实现,卡表是用字节数组实现的,卡表数组的每个元素都是代表某块具体内存区域,这个内存区域叫卡,卡页的大小是512字节,代表一块特定大小的内存块,若在这块内存块中有一个或多个的跨代指针,则将对应的卡表元素标为1,代表“变脏”,否则为0。当虚拟机扫描卡表元素为1时,便将对应的卡页内存区域加入到GC ROOT中一并扫描。写屏障使用写屏障来实现卡表元素变脏。

2024-02-26 11:31:47 1443

原创 jvm-jvm七款经典垃圾收集器

虽然历史久远,但它依然是HotSpot虚拟机运行在客户端模式下,或者4核4GB以下服务端的默认新生代收集器,这种核心数和内存空间较小的场景下,它单线程的优势就体现出来了,没有线程交互的开销,加上内存空间不大,单次回收耗时几十毫秒,这点停顿时间,完全是可以接受的。​ 最终标记和CMS的重新标记阶段一样,也是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短,也需要“Stop The World”。

2024-02-23 17:22:30 1732

原创 jvm-jvm类加载机制

​ java代码编译后就会生成JVM能够识别的二进制字节流文件*.class文件,将class文件加载到内存,最终成为可以被JVM直接使用的Java类型,这个过程叫做JVM的类加载机制。

2024-02-20 11:24:17 981

原创 多线程-线程池

这里重要的地方是第二个if判断,目的是控制线程池的有效线程数量。由上文中的分析可以知道,在执行execute方法时,如果当前线程池的线程数量超过了corePoolSize且小于maximumPoolSize,并且workQueue已满时,则可以增加工作线程,但这时如果超时没有获取到任务,也就是timedOut为true的情况,说明workQueue已经为空了,也就说明了当前线程池中不需要那么多线程来执行任务了,可以把多于corePoolSize数量的线程销毁掉,保持线程数量在corePoolSize即可。

2024-02-06 09:43:57 846

原创 多线程-ReentrantReadWriteLock原理

/ 加锁// 解锁// 加锁// 解锁支持方法(乐观读),读取完毕后需要做一次戳校验 如果校验通过,表示这期间确实没有写操作,数据可以安全使用,如果校验没通过,需要重新获取读锁,保证数据安全。if(!lock.validate(stamp)){ // 验戳// 锁升级// 逻辑try {// 锁升级 - 读锁try {sleep(2);测试一: 读-读 可以优化sleep(0.5);结果:可以看到实际没有加读锁。

2024-02-05 10:21:50 959

原创 多线程-ReentrantLock原理解析

​ AbstractQueuedSynchronizer简称AQS,是一个用于构建锁和同步容器的框架。事实上于包内许多类都是基于AQS构建,例如ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock,FutureTask等。AQS解决了在实现同步容器时设计的大量细节问题。

2024-02-04 09:59:50 1475

原创 多线程-synchronized底层原理

​ 消除锁是虚拟机另外一种锁的优化,这种优化更彻底,Java虚拟机在JIT编译时(可以简单理解为当某段代码即将第一次被执行时 进行编译,又称即时编译),通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过这种方式消除没有必要的锁,可以节省毫无意义的请求锁时间,如下StringBuffer的append是一个同步方法,但是在add方法中的StringBuffer属于一个局部变量,并 且不会被其他线程所使用,因此StringBuffer不可能存在共享资源竞争的情景,JVM会自动将其锁消除。

2024-02-02 14:38:33 832

原创 spring如何解决循环依赖的

我们自己手写了解决循环依赖的代码,可以看到,核心是利用一个map,来解决这个问题的,这个map就相当于缓存。为什么可以这么做,因为我们的bean是单例的,而且是字段注入(setter注入)的,单例意味着只需要创建一次对象,后面就可以从缓存中取出来,字段注入,意味着我们无需调用构造方法进行注入。​ 假设线程Q1调用getBean方法获取A,执行到步骤5将创建对象放入一级缓存后,被阻塞了,此时线程Q2也要获取A,在步骤二中从缓存中拿到了直接返回,但是这个返回的对象并没有完成属性赋值,是一个不完整的对象。

2024-02-01 10:41:00 897

原创 redis的发布订阅和锁

从EVAL的第三个参数开始算起,表示在脚本中所用到的那些Redis键(key),这些键名参数可以在 Lua中通过全局变量KEYS数组,用1为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。​ ActiveMQ所提供的功能远比Redis发布订阅要复杂,毕竟Redis不是专门做发布订阅的,但是如果系统中已经有了Redis,并且需要基本的发布订阅功能,就没有必要再安装ActiveMQ了,因为可能ActiveMQ提供的功能大部分都用不到,而Redis的发布订阅机制就能满足需求。

2024-02-01 09:52:56 774

原创 redis的5种基本数据类型和底层结构

​ 在工作当中,我们经常会遇到与统计相关的功能需求,比如统计网站PV(PageView页面访问量),可以使用Redis的incr、incrby轻松实现。但像UV(UniqueVisitor,独立访客)、独立IP数、搜索记录数等需要去重和计数的问题如何解决?这种求集合中不重复元素个数的问题称为基数问题。数据存储在MySQL表中,使用distinct count计算不重复个数使用Redis提供的hash、set、bitmaps等数据结构来处理。

2024-01-31 10:05:52 900

原创 SpringMvc源码解析

一,SpringMvc源码解析1.1核心流程图解1、用户发送请求至前端控制器DispatcherServlet2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器5、执行处理器(Controller,也叫后端控制器)。6、Co

2024-01-29 09:37:08 930

原创 源码解析-mybatis的插件

** 自定义分页插件实现的简易版分页插件*/@Signature(type = Executor.class,method = "query" ,args ={MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class} ), // 需要代理的对象和方法。

2024-01-26 15:57:01 784

原创 mybatis源码解析-sql执行

CachingExecutor其实是封装了普通的Executor,和普通的区别是在查询前先会查询缓存中是否存在结果,如果存在就使用缓存中的结果,如果不存在还是使用普通的Executor进行查询,再将查询出来的结果存入缓存。这些sqlNode的生成是在解析mapper配置文件的时候,通过对应的handler来解析的,具体解析可以看我上一篇文章解析mapper配置文件的文章。可以看到,分成嵌套和不嵌套两种方法,进行处理,这里我们只管理不嵌套的处理,嵌套的虽然会比不嵌套复杂一点,但总体类似,差别并不大。

2024-01-26 15:47:37 488

原创 mybatis源码解析-加载Mapper配置文件

这就提供了可观的性能提升。以上就创建好了一个Cache的实例,然后把它添加到Configuration中,并且设置到currentCache属性中,这个属性后面还要使用,也就是Cache实例后面还要使用,我们后面再看。flushInterval(刷新间隔)属性:可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。​ parameterMap标签的作用和resultMap标签的作用是类似的,都是将查询结果集中列值的类型一一映射到java对象属性的类型上,在开发过程中不推荐这种方式。

2024-01-26 15:46:15 486

原创 mybatis源码解析核心配置文件

1、 数据库连接创建、释放频繁造成系统资源浪费,从而影响系统性能。如果使用数据库连接池可解决此问题。2、 Sql语句在代码中硬编码,造成代码不易维护,实际应用中sql变化的可能较大,sql变动需要改变java代码。3、 使用preparedStatement向占有位符号传参数存在硬编码,因为sql语句的where条件不一定,可能多也可能少,修改sql还要修改代码,系统不易维护。

2024-01-26 15:44:52 354

原创 源码解析-mybatis的缓存

MyBatis的一级查询缓存(也叫作本地缓存)是基于类的HashMap本地缓存,其作用域是SqlSession,myBatis 默认一级查询缓存是开启状态,且不能关闭。在同一个SqlSession中两次执行相同的 sql查询语句,第一次执行完毕后,会将查询结果写入到缓存中,第二次会从缓存中直接获取数据,而不再到数据库中进行查询,这样就减少了数据库的访问,从而提高查询效率。

2024-01-26 15:43:45 796

Struts2 (S2-016/S2-017)高危漏洞修复文件

Struts2 (S2-016/S2-017)高危漏洞修复文件

2023-04-06

百度Ai人脸识别登录

封装好的工具可以直接使用,包含SDK和AP两种开发方式。包含百度Ai的人脸识别的所有部分。可以下来看一看,不建议实际开发使用。

2019-04-14

空空如也

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

TA关注的人

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