自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

huangdi1309的博客

追求原创但不反对转载

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

原创 解读注解@Value占位符替换过程

其中embeddedValueResolvers是PropertySourcesPropertyResolver以及PropertySourcesPlaceholderConfigurer,这两个对象是在属性填充之前已经准备好,上一篇文章最开始加载配置资源的也有提到,org.springframework.context.support.PropertySourcesPlaceholderConfigurer#postProcessBeanFactory方法,具体看这个方法。

2023-08-15 19:12:13 1193

原创 源码断点分析Spring的占位符(Placeholder)是怎么工作的

基于Spring bean的生命周期,BeanFactoryPostProcessor执行方法postProcessBeanFactory,解析获取到属性源即environmentProperties以及localProperties两种,跟着解析占位符,然后得到具体的值,最后set进去替换占位符为具体的属性值。其中属性myPropertyName是带有’ ${}’ 符号,也就是占位符的变量,最终需要替换成具体的值,Spring会最终替换,那么它怎么做到的?下面就通过打断点跟源码方式分析来分析说明。

2023-08-14 20:52:42 1122

原创 SpringSecurity基于WebFlux实现验证授权启动报conversionServicePostProcessor already been defined

意思是conversionServicePostProcessor这个bean被重复定义,然后又不允许覆盖。如果使用WebFlux要去掉spring-boot-starter-web这个包的引入。

2023-07-05 19:28:57 1857

原创 小程序微信支付实践案例-JAVA

微信支付接入

2022-11-22 17:39:18 5661 3

原创 bean mvcUrlPathHelper could not be registered. A bean with that name has already been defined

A bean with that name has already been defined and overriding is disabled.

2022-10-13 16:25:57 719

原创 JDK源码学习系列之ThreadLocal

文章目录1. 存储结构2. 核心成员变量3. 成员方法1. 存储结构Thread类成员变量threadLocals是一个Map结构,每个线程都有一个独立的ThreadLoaclMap对象,其中存储的是Entry对象,它的key就是我们平时定义的ThreadLocal对象,value是其中的value,因为可能在同一个线程中定义多个ThreadLocal,所以图中每一个index下标会对应其中的一个ThreadLocal对象信息。2. 核心成员变量// 每个ThreadLocal对象都分配一个has

2022-05-04 16:15:58 800

原创 设计模式之——策略模式

假如现在有一个需求:针对来自不同国家的人,分别展示他们擅长的竞技项目以及一些相同的特点。先定义一个Person.javaclass Person { sex() {男 / 女}; smile() {// 爱笑} speak() {// 说话} sport() {// 擅长的运动 比如足球} }人有共同的特点,比如都爱笑,性别分为男人和女人,所以从OO的进度,你首先可能会想到继承,这样代码也可以复用。现在产品经理说,我现在要看看德国人,你创建了一个类:German.jav

2022-03-20 12:07:53 266

原创 SpringMVC加载过程并附上过程源码

开局先盗 (偷) 一张网上的图:从图中,可以看出 DispatcherServlet 这个类充当了中央控制器的角色,客户端发起请求需要经过它,中间每一个处理环节也要经过它处理再返回。每次请求都先进入到这里DispatcherServlet#doDispatchprotected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletReques

2022-03-17 18:39:36 1340

原创 JDK源码学习系列之LinkedList链表

文章目录1.类继承体系2.长度3.重要方法3.1 add(E e)3.2 get(int index)3.3 add(int index, E element)3.4 remove(int index)3.5 indexOf(Object o)3.6 lastIndexOf(Object o)4. 与ArrayList性能比较1.类继承体系LinkedList是双向链表数据结构,它又实现了队列接口,所以又有队列的特性。2.长度链表不像数组那样有初始长度,除了头尾节点,每个节点都有对应的前后两个节点

2022-03-14 20:11:50 1430

原创 JDK源码学习系列之ArrayList数组

文章目录1.类继承结构2.重要成员变量3.重要方法3.1 get(int index)3.2 add(E e)3.3 add(int index, E e)3.4 remove(int index)3.5 remove(Object o)3.6 addAll(Collection<? extends E> c)3.7 addAll(int index, Collection<? extends E> c)4. 最大长度5. 为什么用transient修饰1.类继承结构2.重要

2022-03-11 21:45:00 681

原创 一次未重写父类hashCode和equal方法引发的线上问题

问题描述定义一个集合用它来收集一些特殊对象,后续对集合中的元素做操作。 集合是一个HashSet,上线后发现异常,有些应该进去的偏偏进不去。 分析过程因为代码中使用到了RedisTemplate的HashOperations,因为我每次操作都是同一个HashOperations对象,所以开始怀疑HashOperations不是线程安全的,后面证实它在并发环境下没有问题。 于是线下模拟一遍, 发现HashSet永远只有一个,但是其实每次add进去的都是新的,为什么没有新增? 后面才发现原来自定义对象没有重写

2022-01-10 11:55:05 496

原创 Spring解决循环依赖过程

依赖注入三种方式构造器注入set方法注入注解方式注入循环依赖场景我们知道spring是通过依赖注入(DI)来完成属性的填充,而循环依赖是指实例化两个bean互相依赖对方的情况,比如A依赖B,B又依赖了A的情况,如图实例化A时候发现依赖B,从而转去实例化B,在实例化B过程中又发现依赖了A,转去实例化A,如果没有应对策略,spring实例化bean过程就会出现死循环,所以为了解决这个问题,spring是使用了三级缓存,分别为如下所示:Map<String, Object> sin

2021-12-26 16:19:07 482 2

原创 spring-kafka消费线程加载过程分析

因为最近遇到spring-kafka消费线程中断消费的问题,所以看了它消费线程的启动过程,来总结一下。Lifecycle和SmartLifecycle要想知道它的加载过程,首先要先了解这两个接口:Lifecycle是Spring中最基础的生命周期接口,该接口定义了容器启动和停止的方法。SmartLifecycle是对Lifecycle的一个扩展接口,相比Lifecycle增加以下功能:无需容器显示调用start()方法,就可以回调SmartLifecycle接口的start()容器中如果有多个

2021-12-23 01:14:08 1821

原创 记一次kafka Consumer线程停止消费过程分析

前言kafka消息队列在项目开发中经常被使用,尤其是在大数据领域经常见到它的身影。spring集成了kafka方便我们使用,只要引入spring-kafka即可。问题描述有一天我们后台版本发布,虽然改动很大,但是大家还是自信满满,因为经过了好几轮测试验证都没有问题,但是很不幸结果还是出现问题了,上线后发现kafka消费线程只拉取了一次就莫名其妙停止了(kafka消费者是不同的从服务端poll拉取消息来消费的)连线程异常堆栈信息都没有抛出,于是大家都陷入了沉思,最后迫不得已只能回滚。这里使用的是spr

2021-12-21 21:30:00 7610 1

原创 JDK线程池异常被吞掉的设计思考

大家都知道提交任务到线程池有execute和submit两种,如果业务处理出异常了,那么前者是会抛出堆栈信息,或者不会抛出,具体为什么,大家可以去看看源码就知道了。不过我这里有个疑问,就是Doug Lea大神为什么会设计成一种可以抛异常,一种不抛而是自己吞掉呢?基于这段代码final void runWorker(Worker w) { Thread wt = Thread.currentThread(); Runnable task = w.firstTask;

2021-12-16 19:59:41 706

原创 Jedis高并发下操作redis报错:java.net.SocketException: Connection reset by peer: socket write error

前言项目中读写redis用的是spring-data-redis提供的,方便嘛,但是有一天我想用Jedis来操作redis,于是我就从RedisTemplate中拿到了Jedis,也确实拿到了,于是就有了这个问题。开始自测时候没有发现问题,因为都是单线程环境下,没有覆盖到高并发情况,但是上生产后发现杯具了。从RedisTemplate获取Jedis代码如下:import lombok.extern.slf4j.Slf4j;import org.springframework.data.redis.

2021-12-14 21:04:47 4849

原创 非常详细的Spring bean生命周期图

去年也画过一张图:在这里现在回头看看,没脸看-_-

2021-12-10 07:46:12 466

原创 ImportBeanDefinitionRegistrar作用原理介绍

介绍简单的说,就是在spring应用启动过程,一些被@Import注解的类(这些类都实现了ImportBeanDefinitionRegistrar接口)会执行ImportBeanDefinitionRegistrar的registerBeanDefinitions方法,然后生成BeanDefinition对象,并最终注册到BeanDefinitionRegistry中,为后续实例化bean做准备的。在哪里用到了?以我们非常熟悉的spring boot应用为例,启动类就包含了,@SpringBoot

2021-12-07 12:04:53 8709

原创 Spring依赖注入Bean为空,注入失效场景

场景介绍使用spring往一个bean(BeanB)注入另一个bean(BeanA),发现BeanA为null,注入失败了。代码展示/** * @author huangd * @date 2021-11-30 **/@Componentpublic class BBean { @Autowired private ABean aBean; public BBean() { System.out.println("BBean instantiatio

2021-11-30 13:12:35 4710

原创 FactoryBean它是怎么创建一个bean的?

FactoryBeanspring通过ioc创建bean实例和初始化bean,我们可以通过注解方式创建,如@Component、@Service、@Controller等等也可以在@Configuration类中使用@Bean注解来创建还有一种是通过FactoryBean接口来创建。就是说如果初始化bean过程比较复杂,您可以创建自己的 FactoryBean,在该类中编写复杂的初始化逻辑,通过FactoryBean方式来创建。The FactoryBean interface provides

2021-11-26 17:39:28 999

原创 Spring注解@Bean加载过程详解

1. 前言@Bean注解是很常见的,在spring项目中随处可见,如果要定义一个bean让spring帮助我们管理,那么只要在一个带有@Configuration注解的类下面定义即可。比如:@Configurationpublic class Xxx{@Beanpublic MyBean yyds() {return new MyBean();}}这样启动spring应用后,一个name叫yyds的bean会被注入到spring容器中。2. 过程解析那么spring是怎么做的呢?下面

2021-11-12 16:28:59 3330

原创 ApplicationListener监听器使用介绍,@Order加载顺序无效解析

ApplicationListener是Spring事件机制的一部分,与抽象类ApplicationEvent类配合来完成ApplicationContext的事件发布订阅机制。ApplicationEventpackage com.example.demo.event;import org.springframework.context.ApplicationEvent;/** * @author huangd * @date 2021-11-09 **/public class Ob

2021-11-10 11:40:44 2842

原创 spring beanFactory后处理器之BeanDefinitionRegistryPostProcessor原理解析

以上是spring官方文档的描述,翻译过来BeanDefinitionRegistryPostProcessor其实就是用来注册BeanDefinition的。我们都知道,如果为了让spring容器能够实例化各个Bean,就必须先有对应的BeanDefinition,所以这个接口就是为了这个作用的。其中大名鼎鼎的BeanFactoryPostProcessor的实现类ConfigurationClassPostProcessor也实现了这个接口。怎么用?这里以spring boot应用为例定义B.

2021-11-05 22:34:12 376

原创 spring依赖注入注解@Autowired和@Resource原理解析

注解@Autowired和@Resource都可以实现Bean的自动注入。其中@Autowired是通过Bean后处理器 BeanPostProcessor实现类AutowiredAnnotationBeanPostProcessor来完成。而@Resource是通过另外一个CommonAnnotationBeanPostProcessor来实现的。那么Spring是怎么做到区分的呢?先看AbstractAutowireCapableBeanFactory,实例化bean会调用这个类的doCreat

2021-11-02 22:33:52 1157 4

原创 spring boot自动注入redisTemplate的redis连接池究竟有几个连接,超时时间又是多少

前言redis由于它是一种基于内存操作的高性能分布式数据库,很受大众喜爱,经常出现项目中,可以说是开发必备技能。

2021-10-20 11:40:33 3704

原创 MySQL记录锁、S锁、间隙锁、Next-Key Locks等各种锁介绍

在开发中要将数据持久化,就一定要用到数据库。目前世面流行的数据库也比较多,如Oracle、db2、SQLServer、MySQL、HBase、MariaDB等等。其中MySQL备受众多程序员喜爱,很多公司,大厂都在使用,因为其使用方便且开源,更重要的是它是免费的。MySQL常用存储引擎有MyISAM和innodb两种,MyISAM只支持表锁,一锁就整张表被锁,innodb不仅支持表锁,还支持更细粒度行锁。精确的讲锁主要分为两类:S锁,也称共享锁。S锁之间不冲突。X锁,也称为独占锁,X锁只能一个事务获

2021-08-01 21:37:52 907

原创 spring-kafka几种AckMode模式介绍,MANUAL_IMMEDIATE和MANUAL区别

kafka每个partition都有自己的offset,消费端处理完要向kafka服务器提交offset,基于spring-kafka组件有下面几种AckMode提交模式:模式描述MANUALpoll()拉取一批消息,在处理完业务手动调用Acknowledgment.acknowledge()方法先放到map缓存,在下一次poll之前从缓存拿出来批量提交MANUAL_IMMEDIATE每处理完业务手动调用Acknowledgment.acknowledge()后立即提交

2021-07-24 13:51:23 18124 1

原创 利用redis实现获取top N动态变化的数据

有一个这样的需求:客户端不间断上报数据到后台服务器,后台服务判断TOP N里面是否包含当前上报的客户端,其中TOP N来源于上报数据值为前N的客户端。即这个top N数据是不断在变化的。 若客户端在TOP N中则可以继续上报,否则停止上报,如果之前属于TOP N,但后面又被移除的要告知客户端停止上报,新加入的要告知继续上报。方案1:mysql服务端收集客户端上报的数据同步写到mysql的一张表中。存在就按客户端唯一标识更新数据,不存在就插入一条。指定一个字段column A用来排序。开启一个

2021-07-10 13:12:20 1853 1

原创 kafka auto.offset.reset设置earliest从头开始消费

auto.offset.reset设置为earliestspring: kafka: bootstrap-servers: 192.168.?.x:9092 consumer: auto-offset-reset: earliest enable-auto-commit: false假设开始已经有一个消费者组:hdGroup1,已经提交了offset,情况如下:接着新增一个消费者组hdGroup3,会从第一个消息开始消费,无论之前是否partitio

2021-06-29 14:23:34 3574

原创 spring-kafka并行度concurrency在应用集群部署(多个节点)正确设置,附上Kafka Manager监控效果

我们都知道kafka有topic的概念,为了能够更好的支持水平扩容,topic又分了很多的Partition . 消费者负责消费Partition中的消息,一个Partition只能被一个消费者消费,但是一个消费者可以消费多个partition .所以提升消费能力可以开多几个消费者来消费partition,从而提高系统性能。spring.kafka.listener.concurrency就是spring-kafka组件用来开启消费者线程数的参数。应用在单机部署环境下,这个参数很好理解,你想要开几个相应

2021-06-24 17:08:28 6094 4

原创 elasticsearch安装部署和期间遇到的问题和解决

因为工作需要用到elasticsearch,最近在测试环境部署单机版的elasticsearch服务,可以说是相当的波折,一个问题解决一个问题又来,都要吐血了已经,还好最终都得以解决,解决后那一刻真尼玛的爽啊啊啊。。。问题列表:elasticsearch版本的选择,官网那么多版本该怎么选,选的版本能否顺利集成到现有项目中部署的elasticsearch服务是否需要启用xpack.security验证(需要用户名密码)elasticsearch x-pack插件铂金版破解问题安装插件elastic

2021-02-26 15:54:40 410

原创 来个小总结吧

今天是2020年最后一天,想写点什么,但是感觉又没什么好写的,纠结…年初一顿操作猛如虎,定了一个个小目标,现在回头想想,真特么打脸。。自从11年毕业开始踏入社会,现在已有十载,不得不感慨岁月如梭,自己也从一个懵懂的小青年顺利发展成了大叔。从毕业到现在一直在IT领域发(混)展(吃),但是自己技术水平和自己的年龄不成正比,感觉这十年只收获了年龄,技术水平没有同步,现在想想,真惭愧,很后悔。毕业后前两年的我:本人二本毕业,非985、211,在广东省还排上号,外省压根没人知道,学校是出了名的汉子多。 刚

2020-12-31 12:03:21 145 1

原创 spring-kafka消费出现异常:Commit cannot be completed since the group has already rebalanced 消费者突然hung住停止消费

一天发现线上环境大量报kafka异常:CommitFailedExceptionorg.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed since the group has already rebalanced and assigned the partitions to another member. This means that the time between subsequent

2020-11-02 14:40:23 8025 2

原创 ActiveMQ集成springboot项目集群高可用无效,启动失败

基于ZooKeeper和LevelDB搭建ActiveMQ集群,参考文章https://www.cnblogs.com/cac2020/p/9428255.html介绍来配置相关配置。刚开始还是很顺利的,消息正常消费,控制台可以打开。 为了模拟集群高可用,统一kill掉了其中的master节点。 再次启动该节点发现异常:No IOExceptionHandler registered, ignoring IO exception | org.apache.activemq.broker.BrokerSer

2020-08-25 18:04:46 2354 8

原创 Activemq消息组件发布订阅ReDelivery消息重新投递

ActiveMQ 师出名门是 Apache 出品,最流行的,能力强劲的开源消息总线。是完全基于JMS规范的消息组件,并且容易集成主流spring框架,spring boot等,本文以spring boot集成实现生产者发送消息,消费者消费消息,以及消息重新投递。<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:

2020-08-13 21:29:14 312

原创 一张图介绍spring bean生命周期

最近被问到spring bean的生命周期,发现自己答不出来-_-,整理一张图,做个笔记吧。

2020-06-05 21:50:10 202

原创 hashmap在jdk7和jdk8下的区别

数据结构:jdk1.7是数组 + 链表jdk1.8是数据 + 链表 + 红黑树key的hash计算jdk1.7将key的hashCode无符号右移后做异或运算 h ^= k.hashCode(); // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded /

2020-05-28 19:16:09 554

原创 实现一个自定义的spring boot starter

spring boot大家都知道,是集成了spring的几乎所有类库,通过它核心的spring-boot-autoconfigure模块,结合一系列的starter来完成原本需要开发人员配置的各种xml和依赖jar的工作,开发人员针对自身需求,只要引入指定的starter即可。下面就来实现一个自定义的spring boot starter。主要功能是拦截所有controller请求,并打印出请求参数和header部信息。看了网上很多人都拆分成两个模块,autoconfigure模块和starter模块,

2020-05-21 22:37:21 134

原创 MYSQL行转列例子

SELECTperson_id id,max( CASE sex WHEN ‘男’ THEN ff.NAME END ) name1,max( CASE sex WHEN ‘男’ THEN ff.sex END ) sex1,max( CASE sex WHEN ‘女’ THEN ff.NAME END ) name2,max( CASE sex WHEN ‘女’ THEN ff.sex...

2020-04-21 19:14:51 190

原创 MYSQL虚拟列

ALTER TABLE ota_deviceADD COLUMN client_sv VARCHAR(50) AS (json_unquote(json_extract(attributes,’$.client.sv’))) VIRTUAL;

2020-04-21 19:13:29 259

空空如也

空空如也

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

TA关注的人

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