- 博客(58)
- 收藏
- 关注
原创 RocketMQListener监听器的使用思考
前言刚开始用Spring-rocketmq时,好奇怎么只需要一个实现了RocketMQListener接口的自定义监听器就可以消费消息了:这个自定义的消息监听器里,并没有如rocketmq原生Consumer那样对消息进行ack或者nack,那他到底是怎么控制的?为此专门看了下源码,全局搜了@RocketMQMessageListener注解,搜到一些东西,分享下:源码首先ListenerContainerConfiguration实现了SmartInitializingSingleto
2021-04-26 19:04:30 25547 4
原创 Spring boot源码二:启动类源码
SpringApplication.run(SpringBootTestApplication.class, args);通过这样一键启动spring boot,对这段代码研究:run方法中首先会实例化一个SpringApplication,其构造函数如下:point1:这里判断当前的应用类型,通过WebApplicationType.deduceFromClasspath()方法,原理是通过判断有没有加载到几个特定的类,这里我们如果是Servlet应用的话,其判断结果就是Servlet,最
2020-08-10 10:38:54 443
原创 Spring源码讲解(七)Spring中的事件广播机制(Event)
Spring关于Event的相关文档准备工作在spring容器初始化时会做两件事(参考AbstractApplicationContext#refresh方法):1.初始化一个事件广播器AbstractApplicationContext#initApplicationEventMulticaster事件广播器对象主要是用来发布事件的,从上面的源码可以看出来,spring默认注册一个SimpleApplicationEventMulticaster类型的广播器对象,且bean的名
2020-08-10 10:03:43 1556
原创 Spring boot源码一:集成Web MVC
在spring中的spring-boot-autoconfigure包下面有个spring.factories文件,包含了所有Spring boot默认的配置,其中有一个是WebMvcAutoConfiguration,这里会配置所有MVC须要的相关配置项(HandlerMapping&ViewResolver&MessageConverter等)。我们看下这个类上的注解可以发现其启用须要一些条件:首先工程下必须有Servlet相关的类,所以其底层也是MVC那套Dispatche
2020-08-07 11:53:10 419
原创 dubbo源码一:dubbo的SPI机制
概念SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。不过,Du
2020-08-07 09:53:38 450
原创 Spring MVC源码篇
第一步 加载默认策略DispatcherServlet类加载的时候会执行其static代码块,其中读取其内部的DispatcherServlet.properties属性文件加载所有配置的属性,以key,value的形式加载到名为defaultStrategies的Properties中作为其默认的策略。上面的DEFAULT_STRATEGIES_PATH就是文件名DispatcherServlet.properties,看下这个属性文件包含了哪些:其中比较常用的:两个Han..
2020-08-06 16:38:34 313
原创 Spring MVC应用篇---启动配置那些事
关于Spring Mvc的配置传统的配置(Servlet2.0)传统的Spring Mvc配置时须要在web.xml上配置以下内容:这其实是Servlet2.0的规范:1.配置一个ContextLoaderListener作为spring容器初始化的监听器,这样web容器启动的时候(比如tomcat)会通过这个监听器初始化容器。2.配置spring容器初始化时须要读取的配置文件,配合ContextLoaderListener使用。3.配置一个DispatcherServle.
2020-08-06 15:45:03 494
原创 Spring源码讲解(六)BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的扩展区别
由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦这两个扩展点的触发时机基本类似,都是在BeanDefinition加载之后,Bean实例化之前。之所以称为基本类似是因为并非完全相同,官方文档对其接口方法的定义有所不同:BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry:All regular bean definitions will have been loaded,but n
2020-08-06 15:21:41 1174
原创 Spring源码讲解(五)Spring中的生命周期回调
由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦当代码执行完populateBean之后,spring对bean的属性注入就完成了,这个时候的bean已经可以称作是一个真正的bean了,其生命周期已经基本走完了,之后就是执行他的生命周期回调。具体的方法是AbstractAutowireCapableBeanFactory#initializeBean:point1:invokeAwareMethods中会判断当前bean是否实现了以下接口:BeanNameAwa
2020-08-06 15:21:26 609
原创 Spring源码讲解(四)Spring中bean的属性注入
由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦获取要注入的属性的源信息当BeanFactory(AbstractAutowireCapableBeanFactory)调用doCreateBean方法实例化完一个对象之后,会调用第三次后置处理器:可以看到第三次后置处理器是找寻实现了MergedBeanDefinitionPostProcessor接口的后置处理器执行其postProcessMergedBeanDefinition方法,Spring中关键的两个实现
2020-08-06 15:21:14 1014
原创 Spring源码讲解(三)Spring中Bean的实例化和解决循环依赖问题
由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦spring中bean的实例化是从AbstractApplicationContext的finishBeanFactoryInitialization方法开始的,具体的链路是:AnnotationConfigApplicationContext#refresh ->AbstractApplicationContext#finishBeanFactoryInitialization ->DefaultList
2020-08-06 15:21:02 450
原创 Spring源码讲解(二)Spring的类扫描(@ComponentScan)
由于Spring源码过于庞大,文章中不会列出细节,须要大家花时间下去研究哦spring类扫描主要依赖ClassPathBeanDefinitionScanner类(源码一中分析过)ClassPathBeanDefinitionScanner实例化时最终会调用ClassPathScanningCandidateComponentProvider#registerDefaultFilters方法:useDefaultFilters是spring默认传的true,看下这个registerDefau
2020-08-06 15:20:49 548
原创 Spring源码讲解(一)Spring注册BeanDefinition(解析配置类)
在AnnotationConfigApplicationContext上下文对象实例化时,spring会实例化这两个对象,AnnotatedBeanDefinitionReader对象顾名思义就是AnnotatedGenericBeanDefinition类型的bd的读取器,调用其register方法注册的bean注册的bd类型就是AnnotatedGenericBeanDefinition。spring中通过注解启动spring容器时使用的AnnotationConfigAp...
2020-08-06 15:20:37 864 5
原创 Spring Boot全局异常处理
Spring Boot默认启动的时候会注入一个专门处理异常的自动配置类:@Configuration@ConditionalOnWebApplication(type = Type.SERVLET)@ConditionalOnClass({ Servlet.class, DispatcherServlet.class })// Load before the main WebMvcAu...
2019-08-08 09:44:58 339 3
原创 Spring Data Redis配置+源码解读+扩展
简介Spring Data Redis是spring基于Redis做的一些模块化功能,属于spring全家桶其中之一,本篇文章主要是讲其中关于数据缓存方面的实现+源码解读+优化。都知道Redis的其中一个很好的应用场景就是做数据缓存,在没研究Spring的这一块功能之前,我自己也写过基于redis做的缓存实现spring aop结合redis实现数据缓存,Spring对redis缓存的设...
2019-06-20 21:30:57 1291
原创 Nacos-配置中心搭建
启动Nacos Server这里通过docker来启动Nacos Dockergithub上最新的nacos-docker项目与官网描述的有一点不同,这里须要修改几个地方:修改standalone-derby.yamlversion: "3.7"services: nacos: image: nacos/nacos-server:latest contain...
2019-06-20 21:13:49 6264
原创 Spring容器初始化全过程
spring容器主要有三种初始化方式,xml;注解;JavaConfig+注解形式,这里以目前最前卫的JavaConfig初始化方式来解读整个容器的初始化。(毕竟spring官方都强烈建议这种初始化方式,但可悲的是,国内的大部分中小企业还是使用传统的xml...)AnnotationConfigApplicationContext context = new AnnotationConfigA...
2019-04-16 22:11:43 6196
原创 ReentrantLock源码解析
前言:ReentrantLock是java并发包中的同步组件,属于排他锁,其通过CAS的加锁方式相比较synchronized更加轻便,不会造成死锁,其核心实现是其两个内部类FairSync和NonfairSync,意为公平锁和非公平锁,ReentrantLock相关的加锁解锁等方法内部其实都是调用的这两个内部类的对应方法,公平锁和非公平锁都继承了AbstractQueuedSynchroni...
2019-02-28 18:20:20 280
转载 Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
转载自Git使用教程预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料)一:Git是什么?Git是目前世界上最先进的分布式版本控制系统。工作原理 / 流程:Workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库二:SVN与Git的最主要的区别?SVN是集中式版本控制系统,版本库是集中放在中央...
2018-10-25 14:32:57 325433 95
转载 分布式锁的多种实现方式
转载自分布式锁的多种实现方式目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝...
2018-08-05 10:11:49 1313
转载 getRootConfigClasses和getServletConfigClasses区别
在spring in action这本书中关于配置DispatchServlet中如果用非xml的配置方式有这么一段代码(当时很疑惑着两个配置类有什么区别):package spittr.config;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitialize...
2018-06-16 13:31:00 477
原创 FastJson对复杂的泛型对象的解析问题
首先要说的是FastJson提供了一个用于处理泛型反序列化的类TypeReference,在知道具体泛型类型的情况下可以实现反序列化,这里由于应用场景不适用不对其进行讨论。如下场景:public class PieChartVO<T extends BaseDebtVO> implements Serializable { private static final long ser...
2018-05-29 10:25:43 8530
转载 Java8 - IdentityHashMap源码
一、概述先来看看源码中的部分注释,这能够让我们对这个容器有一个初步的了解:This class implements the Map interface with a hash table, using reference-equality in place of object-equality when comparing keys (and values). In other words, i...
2018-05-13 17:22:59 186
转载 面试必备:LinkedHashMap源码解析(JDK8)
概括的说,LinkedHashMap 是一个关联数组、哈希表,它是线程不安全的,允许key为null,value为null。 它继承自HashMap,实现了Map接口。其内部还维护了一个双向链表,在每次插入数据,或者访问、修改数据时,会增加节点、或调整链表的节点顺序。以决定迭代时输出的顺序。默认情况,遍历时的顺序是按照插入节点的顺序。这也是其与HashMap最大的区别。 也可以在构
2018-05-09 15:44:23 170
原创 源码上分析ArrayList/LinkedList的性能
环境:JDK8概述:ArrayList底层是一个数组,数组又容量限制,超出限制时会增加50%容量,默认第一次插入元素时创建大小为10的数组。LinkedList是一个双向链表参考其内部类Nodeprivate static class NodeE> { E item; //当前元素 NodeE> next; //前驱元素
2018-05-08 17:45:05 300
原创 JAVA7/8中的HashMap
Java7 HashMapHashMap 是最简单的,一来我们非常熟悉,二来就是它不支持并发操作,所以源码也非常简单。首先,我们用下面这张图来介绍 HashMap 的结构。如图,HashMap 里面是一个数组,数组中每个元素是一个单向链表,每个元素对应一个Entry,通过next指向下一个Entry。put 过程分析public V put(K var1, V var2) { //...
2018-05-06 20:19:10 456
原创 Redis Cluster 集群一致性原理及slot迁移测试
参考:Redis Cluster原理与管理;Inconsistent slot mapping;Redis中文文档集群信息一致性问题主从和slot的一致性是由epoch来管理的. epoch就像Raft中的term, 但仅仅是像. 每个节点有一个自己独特的epoch和整个集群的epoch, 为简化下面都称为node epoch和cluster epoch. node epoch一直
2017-12-19 09:32:34 16242
转载 Redis Cluster迁移目标节点宕机下填坑
转载自听滴滴大神给你讲Redis Cluster迁移遇到的坑问题背景应@冬洪兄邀请,让我把最近在处理Redis Cluster中遇到的坑分享下,由于个人时间问题,大致整理了一个比较大,比较坑的问题,它可能会导致集群部分slot不可用,甚至需要重建集群。如果对redis cluster不了解的可以查看redis原理分享。架构图如下模拟迁移数据目标节点宕
2017-12-18 09:53:30 4371
原创 本地jedis版本过低踩的坑
环境:jedis-2.7.3;redis-4.0.2客户端使用JedisCluster连接redis集群报错如下:原因:jedis通过JedisClusterInfoCache.discoverClusterNodesAndSlots方法获取集群节点信息,内部实现public void discoverClusterNodesAndSlots(Jedis jedis) {
2017-12-17 14:36:37 5858 2
原创 redis集群 cluster-migration-barrier属性踩坑
cluster-migration-barrier属性可以保证redis集群中不会出现裸奔的主节点(这个主节点没有对应的从节点),当某个主节点的从节点挂掉裸奔后,会从其他富余的主节点分配一个从节点过来,确保每个主节点都有至少一个从节点,不至于因为主节点挂掉而没有相应从节点替换为主节点导致集群崩溃不可用。这里要吐槽下,网上许多的小伙伴对这个属性的介绍还是有点歧义的,譬如这位小伙伴的介绍:
2017-11-24 16:40:49 4395 5
原创 redis cluster设置密码
注意事项:1.如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码2.如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志3.各个节点的密码都必须一致,否则Redirecte
2017-11-22 14:39:25 3717
转载 Redis Cluster集群的搭建与实践
转载自:Redis Cluster集群的搭建与实践Redis Cluster集群一、redis-cluster设计Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:其结构特点: ...
2017-11-13 11:02:58 283
原创 ip变更造成的redis集群不可用的解决及数据备份和恢复
今天打开电脑,连接redis,发现连接不上了...原因是找不到主机...查看虚拟机ip,发现ip变了...于是想到之前配置redis集群的时候,在redis.conf中配置了bind为虚拟机的ip地址,觉得应该是这个原因,于是修配置bind:127.0.0.1,重启集群,想想应该是没问题了,但是...服务启起来了,ip也显示为127.0.0.1,但是
2017-11-08 18:54:51 5753
原创 redis集群搭建过程中踩过的几个坑
这两天在玩redis的集群,搭建过程中遇到了以下几个问题首先是redis:[ERR] Not all 16384 slots are covered by nodes.不是所有的slot都被分配了,可以考虑使用redis-trib.rb的fix参数修复问题节点,会进行重新分配。后来在fix的过程中又遇到下面的问题slot插槽被占用了(这可能是上一次搭建集群是
2017-11-01 18:55:19 2085
转载 google Guava包的ListenableFuture解析
原文地址 译者:罗立树 校对:方腾飞并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写。出于这样的考虑,Guava 定义了 ListenableFuture接口并继承了JDK concurrent包下的Future 接口。我们强烈地建议你在代码中多使用ListenableFuture来代替JDK的 Future, 因为:大多数Futures 方法中
2017-10-22 22:04:06 490
转载 Guava官方文档-RateLimiter类
RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。校对注:RateLimiter使用的是一种叫令牌桶的流控算法,RateLimiter会按照一定的频率往桶里扔令牌,线程拿到令牌才能执行,比如你希望自己的应用程序QPS不要超过1000,那么Rat
2017-10-22 21:53:04 243
转载 Java线程池 ExecutorService
一、ExecutorService介绍ExecutorService是Java中对线程池定义的一个接口,它java.util.concurrent包中,在这个接口中定义了和后台任务执行相关的方法: Java API对ExecutorService接口的实现有两个,所以这两个即是Java线程池具体实现类(详细了解这两个实现类,点击这里):1. ThreadPoolExecut
2017-10-22 21:10:32 267
转载 java Future用法和意义一句话击破
在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。 所以run的返回值是void类型。 如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8...使用多线程来计算。 但后者需要前者的结果,就需要用callable接口了。 callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以
2017-10-22 21:07:36 321
转载 Mybatis 缓存特性的使用及源码分析
文章摘自公众号importNew:Mybatis 缓存特性的使用及源码分析有兴趣的同学可以关注这个公众号。前言主题是Mybatis一级和二级缓存的应用及源码分析。希望在本场chat结束后,能够帮助读者朋友明白以下三点。Mybatis是什么。Mybatis一级和二级缓存如何配置使用。Mybat
2017-10-11 15:04:13 236
原创 spring aop结合redis实现数据缓存
我们项目开发过程中,在实现功能的情况之下对其进行优化是必不可少的,其中一种优化方案就是做数据缓存,对数据做缓存可以减少对数据库的访问压力,在访问量逐步增大的情况下可以分流一部分数据库的压力,对客户端而言,最直观的变化就是请求响应时间变短。我在设想之初就想通过aop+Redis的形式来实现数据缓存,参阅借鉴了很多资料,结合自身项目需求做了这个设计。一.设计两个注解p...
2017-08-17 15:03:49 708
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人