自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(81)
  • 资源 (1)
  • 收藏
  • 关注

原创 spring源码解读系列(八):观察者模式--spring监听器详解

一、前言在前面的文章中spring源码解读系列(八)中,我们继续剖析了spring的核心refresh()方法中的registerBeanPostProcessors(beanFactory)(完成BeanPostProcessor的注册)和initMessageSource()(为上下文初始化message源,即不同语言的消息体,国际化处理),有心的朋友顺着我们的思路继续看,发现下面开始了initApplicationEventMulticaster()(初始化事件监听多路广播器),那么什么又是多路广播

2021-08-17 15:28:31 13881 2

原创 spring源码解读系列(七):注册BeanPostProcessor及初始化messageSource

一、前言在spring源码解读系列(五)中我们介绍了spring核心方法org.springframework.context.support.AbstractApplicationContext#refresh中的invokeBeanFactoryPostProcessors(beanFactory)方法,调用各种beanFactory处理器,并在spring源码解读系列(六)中详细介绍了最重要的beanFactory,即ConfigurationClassPostProcessor,今天我们接着介绍r

2021-08-16 17:32:24 17128 1

原创 spring源码解读系列(六):注解开发的核心实现ConfigurationClassPostProcessor

一、前言在前面的文章中spring源码解读系列(五),我们详解了spring工厂调用BeanFactoryPostProcessors的过程,今天我介绍一下spring工厂中最重要的一个BeanFactoryPostProcessor,即ConfigurationClassPostProcessor,该类是实现spring注解开发的基石,是零配置开发的基础。该类的主要作用是:完成我们常用注解的解析,例如@Configuration,@Bean,@Component,@ComponentScan,@Impo

2021-08-12 16:41:31 14099 3

原创 spring源码解读系列(五):BeanFactoryPostProcessors的调用

一、前言在前面的文章中spring源码解读系列(四),我们已经解析到spring的核心方法org.springframework.context.support.AbstractApplicationContext#refresh的prepareBeanFactory(beanFactory)方法,今天我们接着往下解析,下面postProcessBeanFactory(beanFactory)主要是个空实现,留给子类扩展使用,在spring-web中有详细的扩展,我们暂不做详解,重点看下面的invokeB

2021-08-09 16:29:59 11574 2

原创 spring源码解读系列(四):创建BeanFactory的准备工作

一、前言在前面的文章中(spring源码解读系列(二),spring源码解读系列(三)),我们已经详细介绍了spring的核心方法org.springframework.context.support.AbstractApplicationContext#refresh中的第一步prepareRefresh()和第二步ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(),今天我们接着介绍下面的方法。二、解析prepa

2021-08-06 14:49:01 11497 1

原创 spring源码解读系列(三):详解spring自定义标签

前言在spring源码解读系列(二)的最后我们发现了spring解析bean的方法分为两种,一种是解析spring工厂内部默认的标签,即import、alias、beans、bean;另一种是解析我们自定义的标签,本文详细分析spring解析自定义标签的过程,并带领大家自己实现一个自定义标签。一、解析自定义标签入口parseCustomElement方法作用:根据namespaceUri找到对应的NamespaceHandler实现类对象,然后调用parse方法对传入的标签元素进行解析 @Nulla

2021-08-03 14:04:01 13820 3

原创 spring源码解读系列(二):Spring的核心refresh

前言本篇文章我们进入Spring最核心的方法org.springframework.context.support.AbstractApplicationContext#refresh,先整体熟悉一下此方法的主要工作,然后我们再对其中调用到的核心方法以及扩展点注意解析一、核心方法AbstractApplicationContext.refresh直接进入源码,逐行理解@Override public void refresh() throws BeansException, IllegalStat

2021-08-02 15:56:20 13113 2

原创 spring源码解读系列(一):Bean生命周期图解

一、注意事项:本次源码解读基于Spring-Framework 5.2.9版本,可自行通过官网下载源码,本地安装好gradle后可自行编译和运行,跟随本教程走进Spring底层二、spring创建bean的整体流程三、查看入口代码通过main方法自定义测试类 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Person bean = ac.ge

2021-07-29 17:01:10 19007 5

原创 Kafka系统介绍及高性能原理

一、Kafka介绍二、消息队列的分类至多一次,常见的rabbitmq,rocketmq都是这种方式,通过ACK机制确认消息已被消费者消费,此时会将消息删除;没有限制则主要是通过消费者上传的offset(偏移量)来确认消费消息的初始位置,同一消息可以被反复多次消费,一直到达到指定条件,比如kafka是默认保留7天,7天后则会被删除。三、kafka基础架构Kafka集群以Topic形式负责分类集群中的Record,每一个Record属于一个Topic,每个Topic底层都会对应一组分区的日志用于持

2021-11-16 13:47:35 2135

原创 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll。尝试重新安装此程序以解决此问题

一、产生操作使用个人的windows系统在安装最新的mysql版本mysql-8.0.27-winx64时,在执行mysql安装初始化命令mysqld --initialize报错提示:二、原因分析MySQL 8.0 以上的版本需要Microsoft Visual C ++ 2015可再发行组件包才能在Windows平台上运行三、解决方案尝试解决:刚看到这个问题时,也是一脸迷茫,度娘各种解决方法,尤其是很多推荐去官网下载https://www.microsoft.com/zh-cn/do

2021-11-05 14:25:38 1951

原创 算法进阶之路(五):链表面试题常用数据结构和技巧

一、链表解析思路最常用的主要是两大解题思路:(1):双指针法(快慢指针)(2):使用容器(数组、哈希表等)二、小试牛刀1.面试题:2.**解题思路:**通过双指针法可以简单有效的解答此类问题,定义一个快指针,每次跳两个节点,定义一个慢指针,每次跳一个节点,当快指针调到末尾时,慢指针此时在中点附近。以上四个小题都可以通过这个思路解决,唯一不同的是,指针初始化位置的不同。3.解题代码:针对小题1的解题代码:public class LinkedListTest { public c

2021-11-03 13:43:46 1755

原创 算法进阶之路(四):桶排序之计数排序和基数排序以及排序的稳定性

一、桶排序简介          前面我们介绍的所有排序,选择排序、冒泡排序、插入排序、归并排序、快速排序、堆排序等,都是基于比较的排序,而桶排序是基于容器的排序,主要分为:计数排序和基数排序,时间复杂度都是O(N),额外空间复杂度O(M),但是应用范围有限,需要样本的数据状况满足桶的划分。二、计数排序计数排序,不是基于元素比较,而是利用数组下标确定元素的正确位置。1:找出原数组中元素值最大的,记为max。2:创建一个新数组count,其长度是m

2021-10-25 13:57:47 9261

原创 算法进阶之路(三):堆的数据结构、排序及应用

一、堆的数据结构        堆就是用数组实现的二叉树,主要分为两种:最大堆和最小堆。两者的差别在于节点的排序方式,在最大堆中,父节点的值比每一个子节点的值都要大。在最小堆中,父节点的值比每一个子节点的值都要小。这就是所谓的“堆属性”,并且这个属性对堆中的每一个节点都成立。        需要注意的是,堆的根节点中存放的是最大或者最小元素,但是其他节点的排序顺序是未知的。例如,在一个最大堆中,最大的那一个元素总是位于 in

2021-10-21 15:25:19 9934

原创 算法进阶之路(二):递归、归并排序和快速排序

1.递归递归的本质是利用系统栈的数据结构,完成遍历,因此任何递归行为都可以改为非递归。递归的时间复杂度分析:任何递归的时间复杂度最终都可以使用上面的表达式来表示,其时间复杂度按照公式分析即可。真题分析使用递归的方式,判断数组任意范围内的最大值,代码实现如下:...

2021-10-15 16:31:06 6277

原创 算法进阶之路(一): 时间复杂度和空间复杂度

一、前言时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小,一般都用大O表示法来表示,记作:T(n)=O(f(n)),都是评估算法的核心指标,评估算法优劣的核心指标除了时间和空间复杂度,还包含常数项时间,其中时间和空间复杂度主要由执行流程决定,常数项时间主要有时间细节决定。下文中我们将一一介绍。二、评估算法优劣的核心指标1.常数时间的操作如果一个操作的执行时间不以具体样本量为转移,每次执行时间都是固定时间,称这样的操作常数时间的操作。2.时间复杂度时间复杂度,本质上是

2021-10-14 15:15:29 16009

原创 Spring自定义注解实现redis缓存

一、前言redis是分布式微服务中必用的基础组件之一,现在国内的大部分项目基本上用到,缓存是其主要作用之一,而在项目中频繁使用set()方法添加注解,会造成代码的重复和臃肿,对于开发经验不足的小白,甚至会因为缓存的添加不当直接影响到正常的业务流程,从而酿成事故,因此成熟的公司都会通过封装基础组件,实现通过注解自动添加redis缓存,本文会从原理出发,带领大家亲自实现自定义注解,完成redis缓存的开发,学会了,你可以在同事面前秀一把了。二、自定义注解的参数说明@Target:注解的作用目标,即注解可

2021-10-13 10:26:46 17846

原创 JVM类加载流程及双亲委派机制

一、类加载流程二、类加载器三、源码分析查看java.lang.ClassLoader的loadClass(java.lang.String, boolean)方法的源码:protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { synchronized (getClassLoadingLock(name)) {

2021-10-12 17:09:16 16995

原创 大数据架构演变之路

一、Java Web为什么需要大数据二、数据库-OLTP & 数据仓库-OLAP三、大数据架构演变1.传统离线大数据架构2.Lambda架构(离线处理+实时链路)离线数仓+实时数仓3.Kappa架构四、架构选择五、实时数仓发展趋势六、实时数仓实践顺丰实时数仓架构...

2021-09-28 10:02:48 18086

原创 java对象的内存模型详解:内存模型及对象头的奥秘

在面试官的因势利导下,很多人对jvm的内存模型已经耳熟能详,但是对我们经常new 出来的对象,比如new Object(),你了解它的内存模型吗?本篇文章将带你走进对象内部,真正去了解这个你最熟悉,也最不熟悉的的对象。一、对象的内存模型先上图,简单易懂:再看jvm源码:class oopDesc { friend class VMStructs; friend class JVMCIVMStructs; private: // 对象头 volatile markOop _ma

2021-08-26 16:39:18 32343 1

原创 epoll、poll、select的原理和区别

一、什么是epoll?epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现。IO多路复用是指,在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll有两种工作方式,ET-水平触发 和 LT-边缘触发(默认工作方式),主要区别是:LT,内核通知你fd是否就绪,如果没有处理,则会持续通知。而ET,内核只通知一次。二、epoll的三个函数 int epoll_create(int size)size参数告诉内核这

2021-08-24 14:49:14 33538 1

原创 Java原子操作类总结-AtomicReference、AtomicReferenceFieldUpdater

一、AtomicReferenceFieldUpdaterAtomicReferenceFieldUpdater是基于反射的工具类,用来将指定类型的指定的volatile引用字段进行原子更新,对应的原子引用字段不能是private的。通常一个类volatile成员属性获取值、设定为某个值两个操作时非原子的,若想将其变为原子的,则可通过AtomicReferenceFieldUpdater来实现。通过调用AtomicReferenceFieldUpdater.newUpdater静态方法生成指定类型、指定

2021-08-23 14:11:11 64

原创 spring常见面试题:IOC、循环依赖、设计模式

一、谈谈你对SpringIOC的理解二、BeanFactory和FactoryBean的区别三、spring中用到哪些设计模式?四、applicationContext和BeanFactory的区别五、谈谈你对循环依赖的理解

2021-08-20 10:53:29 13719

原创 利用数组实现简单的循环队列

原理:在数组不做扩容的前提下,如何让新元素入队并确定新的队尾位置呢? 我们可以利用已出队元素留下的空间,让队尾指针重新指回数组的首 位。这样一来,整个队列的元素就“循环”起来了。在物理存储上,队尾的位 置也可以在队头之前。当再有元素入队时,将其放入数组的首位,队尾 指针继续后移即可。一直到(队尾下标+1)%数组长度 = 队头下标 时,代表此队列真的已 经满了。需要注意的是,队尾指针指向的位置永远空出1位,所以队列最大容量比数组长度小1。这就是所谓的循环队列。public class CirculeQ

2021-07-30 15:34:20 11563

原创 单向链表的java实现

定义节点@Datapublic class LinkNode { /** * 节点中的值 */ private int data; /** * 节点中的指针,指向下一个节点 */ private LinkNode next;}链表的常规操作及测试/** * @author ljx * @Description: 链表的常规操作及测试 * @date 2021/7/29 2:35 下午 */public class

2021-07-29 15:59:23 16

原创 杂七杂八零碎知识点

一、反射性能测试

2021-07-29 12:01:52 33

原创 mysql的ACID和事务实现原理

一、ACID实现原理二、快照读与当前读三、持久化的具体实现-redo.logredolog和binlog更新流程两阶段提交四、题目分析查看mysql的隔离级别五、mvcc1.mysql中的隐藏字段2.undolog3.readviewreadview可见性分析判断六、RC和RR的区别七、mysql中锁...

2021-07-27 14:01:24 30

原创 ReentrantLock源码详解:AQS原理分析

说明:本篇文章以公平锁(FairSync)说明,非公平锁的原理和公平锁大部分雷同,实现更简单,搞懂了公平锁的源码及原理,即可理解非公平锁加锁过程 /** * 主要做三件事 1.tryAcquire:尝试通过CAS获取一次锁,详情可见下面源码分析 * 2.addWaiter:将当前线程加入到储存等待获取锁的线程的双向链表中 * 3.acquireQueued:通过自旋的方式,判断当前队列节点是否可以获取锁 */ public

2021-07-22 12:02:06 13776 3

原创 透过表面看本质---锁

锁的五大特性1.互斥性锁的基本特性,当一个线程获得了锁,其他线程只能等待2.死锁问题使用锁就会遇到的问题,必须避免从设计和程序上避免3.一致性加锁和释放锁尽量是同一个线程,否则容易引发锁失效4.可重入性获得锁的线程,可以重复多次获得该锁5.锁续命问题分布式锁为避免死锁经常设置有效时间,当有效时间过期,业务还在执行时,需要通过watchdog给锁续命...

2021-07-22 11:28:51 24

原创 移动零算法求解

一、题目要求二、解体思路1.双指针法思路:左指针代表0元素的起始位置,右指针代表数组的遍历位置;在没有遇到0之前,左指针和右指针的位置是相同的,此时什么都不需要做;在遇到0之后,左指针和右指针的位置不在相同,此时需要调换位置,即把右指针的值赋值给左指针,右指针改为0,同时左指针左移一位代码如下: public static void moveZeroes(int[] nums) { int left = 0; for (int right = 0;rig

2021-07-21 13:42:35 25

原创 一文贯通→过滤器与拦截器详解

一、过滤器Filter过滤器英文叫 Filter,是 JavaEE 的标准,依赖于 Servlet 容器,可以按照指定顺序配置多个。常用来配置请求编码以及过滤一些非法参数,垃圾信息或者是网站登录验证码。目前主要有三种实现方式1、基于SpringMVC的实现方式主要分为两步自定义过滤器,实现javax.servlet.Filter接口public class JavaEncodeFilter implements Filter { private String encoding = "

2021-04-23 14:24:58 12674 1

原创 linux常用命令详解

ps -aux和ps -ef在linux系统中,ps是简单而强大的进程查看命令,而ps -aux和ps -ef是打印出所有进程。其中的参数详解如下:ps -aux 是以BSD方式显示a 显示所有用户的进程(show processes for all users) u 显示用户(display the process’s user/owner) x 显示无控制终端的进程(also show processes not attached to a terminal)ps -ef 是以System V方

2021-04-22 16:40:12 21

原创 JVM可视化监控---VisualVM

一、VisualVMVisualVM是Netbeans的profile子项目,在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。如果已经正确配置classpath路径,VisualVM的启动非常简单,只需在命令行输入jvisualvm即可启动图形化界面。VisualVM不仅支持本机监控,还支持远程监控。二、安装方式jdk自带,bin目录下,双击即可打开,如

2021-04-21 19:52:12 31662 1

原创 基于ApplicationListener的事件监听机制

一 基本原理ApplicationListener事件监听机制是经典的观察者设计模式的实现,基本原理就是:通过ApplicationEvent类和ApplicationListener接口,实现ApplicationContext事件处理,每当ApplicationContext发布ApplicationEvent时,ApplicationListener Bean将自动被触发。这种事件机制都必须需要程序显示的触发。二 spring内置事件ContextRefreshedEventApplic

2021-04-14 11:07:53 61

原创 微信常见问题处理

微信缓存清除微信设置里自带的清楚缓存,有时候清理不干净,遇到这种情况的时候,可以试试用这个链接清理1.微信环境访问链接:debugx5.qq.com2.打开页面,勾选如图所示的选项3.点击清除即可...

2021-04-09 11:52:00 46

原创 java中Enum详解

一.枚举的实现原理定义一个简单的Enum,如下所示:public enum Sex { MALE("男"),FEMALE("女"); private String desc; Sex(String desc) { this.desc = desc; }}反编译后,如下:public final class Sex extends Enum{ public static Sex[] values() { ret

2021-04-07 12:04:26 14199 2

原创 巧用Spring中的注解

Spring Boot1.Spring Boot下控制配置执行顺序Spring Boot下对自动配置的管理对比于Spring它就是黑盒,它会根据当前容器内的情况来动态的判断自动配置类的载入与否、以及载入的顺序,所以可以说:Spring Boot的自动配置它对顺序是有强要求的。需求驱使,Spring Boot给我们提供了**@AutoConfigureBefore、@AutoConfigureAfter、@AutoConfigureOrder**(下面统称这三个注解为“三大注解”)这三个注解来帮我们解决这

2021-04-06 14:53:57 23

原创 java基础面试

一.java线程池的核心参数及工作原理核心参数:corePoolSize:核心线程数,当线程数小于该值时,线程池会优先创建新线程来执行任务,如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程,除非设置了allowCoreThreadTimeOut,否则核心线程将持续保留在线程池中即时没有新的任务提交过来。maximumPoolSize:最大线程数,即线程池所能允许创建的最大线程数量。keepAliveTime:空闲线程存活时间,当线程数量大于核心线

2021-03-08 14:05:48 32

原创 优秀技术文章分享

高并发之限流-漏桶算法和令牌桶算法1.https://www.cnblogs.com/xuwc/p/9123078.html

2021-03-01 15:39:15 14201

原创 玩转Spring,你不得不知的实用功能

一、实现初bean的始化spring中支持3种初始化bean的方法:xml中指定init-method方法使用@PostConstruct注解实现InitializingBean接口第一种方法太古老了,现在用的人不多,具体用法就不介绍了。1.使用@PostConstruct注解在需要初始化的方法上增加@PostConstruct注解,这样就有初始化的能力。@Servicepublic class TestService1 { @PostConstruct publi

2021-01-15 16:42:40 13798

原创 股市跷跷板—债券基金

一、债券基金和股票相关性从历史上看,债券也跟股市有一定的负相关性,或者说跷跷板效应。在过去12年里,当股市低迷时,同期债基投资回报可观。债券是跨周期资产配置不可或缺的一部分。从上表可以看到,当股市下跌时候,往往债市收益还不错,但也不是绝对的。基本逻辑是这样的,经济具有周期性,当经济向好,股市大涨,随后是经济过热,股市也会疯狂,国家为抑制经济过热,降低通货膨胀,采用紧缩的货币政策,最终提升了市场利率,利率上升,债券收益率下降。当经济过于低迷,往往股市行业也不好,比如2018年,此时,国家也会出台政策刺激

2021-01-13 11:38:04 173

软考高级-信息系统项目管理师全套备考资料及真题和论文.zip

本人一个月备考,顺利考上软考高级-信息系统项目管理师的全套学习资料,内部有重要知识点的总结,大量论文范文,历年真题及解析,希望给大家带来方便

2021-08-20

空空如也

空空如也

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

TA关注的人 TA的粉丝

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