Java
文章平均质量分 86
墨、鱼
我总是一个人在练习
展开
-
【必看!】动态修改SpringBoot定时任务执行周期
带着问题阅读源码比通篇无脑阅读源码更容易,找到问题、解决问题以后也更有成就感。原创 2023-07-20 14:22:51 · 1800 阅读 · 0 评论 -
SpringBoot中Jackson序列化处理自定义注解
上篇文章 Jackson序列化带有注解的字段的原理浅析 里已经简单介绍了Jackson如何序列化带有注解的字段。本文尝试自己定义一个注解,让Jackson序列化时对标注了该注解的字段进行脱敏。原创 2023-03-07 21:09:45 · 4743 阅读 · 8 评论 -
Jackson序列化带有注解的字段的原理浅析
序列化器指的是包含对某种类型的数据的序列化方式的类。如自带的有:对String类型序列化的StringSerializer,对Date类型序列化的DateSerializer,对Bean序列化的BeanSerializer。经过上面的分析,知道了Jackson如何序列化标注的字段。那能否自己定义一个注解,让Jackson通过自定义的序列化器来处理该注解标注的字段🤔️?且等下篇文章再来探究~原创 2023-02-05 16:27:33 · 1323 阅读 · 2 评论 -
Server-Sent Events 一种轻量级的Push方式
Server-Sent Events 一种轻量级的Push方式。原创 2022-07-31 14:21:00 · 2676 阅读 · 0 评论 -
Mybatis动态SQL踩坑记
Mybatis动态SQL的一个踩坑复盘~原创 2022-06-24 10:40:57 · 1511 阅读 · 1 评论 -
一个简单的Java抽奖程序
文章目录需求背景设计思路代码实现定义奖品及中奖概率执行抽奖中奖率测试测试结果数据本文逻辑思想比较简单,旨在了解后端如何设计抽奖以及控制抽奖概率。需求背景现在奖品池有如下奖品:序号名称中奖率0代金券10元20%1代金券50元14%2蓝牙耳机10%3Switch游戏机5%4iPhone 13Pro1%5谢谢参与50%需要设计一个抽奖程序,保证最终的抽奖结果近可能贴近每个奖品的中奖率。设计思路首先看看现实生活中的抽奖原创 2022-05-21 15:15:11 · 6770 阅读 · 0 评论 -
基于Dubbo SPI来统计接口的TP90、TP99指标
主要原理还是依赖Dubbo的Filter机制。import org.apache.dubbo.common.constants.CommonConstants;import org.apache.dubbo.common.extension.Activate;import org.apache.dubbo.rpc.*;import org.springframework.util.CollectionUtils;import java.math.BigDecimal;import java.原创 2021-11-09 15:14:42 · 543 阅读 · 2 评论 -
为什么Volatile能保证双重检查锁的线程安全
文章目录1、双重检查锁的由来1.1、非线程安全的懒汉式单例1.2、线程安全的懒汉式单例2、问题的根源3、解决方案3.1、基于volatile的解决方案3.2、基于类初始化的解决方案4、总结单例模式分为懒汉式和饿汉式。懒汉式其实就是为了延迟初始化来降低初始化类和创建对象的开销。1、双重检查锁的由来1.1、非线程安全的懒汉式单例一种懒汉式的单例写法如下:public class UnsafeLazyInitialization { private static Instance inst原创 2021-11-08 20:42:22 · 651 阅读 · 1 评论 -
使用三个线程,按顺序打印X,Y,Z,连续打印10次
/** * 题目描述:使用三个线程,按顺序打印X,Y,Z,连续打印10次。 * @author xujian * 2021-06-25 13:38 **/public class PrintXYZ { //定义CountDownLatch,起到线程通知的作用 private static CountDownLatch cd1 = new CountDownLatch(1); private static CountDownLatch cd2 = new CountDownL原创 2021-06-25 15:54:26 · 288 阅读 · 0 评论 -
Tomcat学习笔记
文章目录第⼀部分:Tomcat 系统架构与原理剖析1.1 浏览器访问服务器的流程1.2 Tomcat 系统总体架构1.2.1 Tomcat Servlet容器处理流程1.2.2 连接器组件 Coyote1.2.3 容器组件Catalina第二部分:⼿写实现迷你版 Tomcat第三部分:核⼼流程源码剖析3.1 Tomcat启动流程3.3 Tomcat请求处理流程第四部分:Tomcat 类加载机制剖析第五部分:Tomcat 性能优化5.1 虚拟机运⾏优化(参数调整)5.2 Tomcat 配置调优第⼀部分:To原创 2021-06-21 15:31:38 · 460 阅读 · 0 评论 -
实现一个增强版的JDK动态代理V2.0
文章目录分析之前实现的不足1)前、后增强是通过写死执行增强的位置来实现2)没有实现环绕增强优化改进之前有个文章实现了一个简单的增强版JDK动态代理:实现一个增强版的JDK动态代理。但是当时只是实现了方法前增强和方法返回后增强的效果,至少还有如下两个不足:1)前、后增强是通过写死执行增强的位置来实现;2)没有实现环绕增强;分析之前实现的不足1)前、后增强是通过写死执行增强的位置来实现先来回顾一下之前实现的代码public Object proceed(JoinPointInfo joinP原创 2021-06-18 18:27:59 · 287 阅读 · 0 评论 -
SpringBoot学习笔记
文章目录第一部分:SpringBoot应用回顾1.1 概述1.2 主要特性1.3 抛出疑问1.4 热部署1.5 全局配置文件1.6 属性注入1.6.1 属性注入常用注解1.6.2 如何覆盖第三方配置1.7 日志框架第二部分:SpringBoot源码剖析2.1 【重点】自动配置2.2 Run方法执行流程2.2.1 SpringApplication() 构造方法2.2.2 run(args)2.3 内嵌Tomcat2.3.1 内嵌Tomcat自动配置原理2.3.3 自动配置SpringMVC第三部分:Spri原创 2021-06-14 14:32:37 · 370 阅读 · 0 评论 -
探索Spring循环依赖的细节
文章目录背景回顾细节探索为什么一样什么情况下会不一样lagouBean.getItBean()问题之前在Spring学习笔记,挺全的!这个博客中提到了Spring对循环依赖的解决原理,这篇博客对一些细节做个补充。背景回顾@Servicepublic class LagouBean { @Autowired private ItBean itBean; public ServiceB getServiceB() { return serviceB; }}原创 2021-06-08 20:26:27 · 321 阅读 · 5 评论 -
SpringMVC学习笔记
文章目录1.1 Spring MVC 简介1.1.1 MVC 体系结构1.1.2 SpringMVC介绍1.2 SpringMVC请求处理流程1.3 参数绑定1.4 RESTful支持1.5 和Ajax Json交互第⼆部分 Spring MVC ⾼级技术1.1 拦截器(Inteceptor)使⽤1.1.1 监听器、过滤器和拦截器1.1.2 拦截器的执⾏流程1.1.3 多个拦截器的执⾏流程1.2 处理multipart形式的数据1.3 在控制器中处理异常1.4 重定向请求参数传递第三部分 ⼿写 MVC 框架原创 2021-05-31 19:42:51 · 692 阅读 · 5 评论 -
Spring学习笔记
Spring学习笔记第一部分:Spring 概述1.1 Spring 简介轻量级开源框架核心是IOC和AOP使⽤最多的 Java EE 企业应⽤开源框架1.2 Spring 发展历程EJB->Expert One-to-One J2EE Design and Development论文->Spring1.3 Spring 的优势⽅便解耦,简化开发通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进⾏控制,避免硬编码所造成的过度程序耦合。⽤户也不原创 2021-05-27 18:25:25 · 2222 阅读 · 2 评论 -
实现一个增强版的JDK动态代理V1.0
文章目录背景现状目标方案定义拦截器定义拦截器链定义InvocationHandler定义增强的代理生成类测试总结背景看了Spring AOP JDK动态代理部分的源码,想尝试借鉴Spring的思想,实现一个“增强版”的JDK动态代理。本博文以及相关代码仅作为练习使用,欢迎指正和交流探讨。现状UserService userService = new UserServiceImpl();MyInvocationHandler myInvocationHandler = new MyInvoca原创 2021-05-27 18:17:06 · 390 阅读 · 1 评论 -
Mybatis学习笔记,挺全的!
文章目录第一部分:自定义持久层框架1.1 分析手动编写JDBC操作面临的问题1.2 针对性的给出问题的解决思路1.3 尝试编写自定义框架解决面临的问题第二部分:Mybatis相关概念2.1 简介2.2 历史2.3 优势第三部分:Mybatis基本应用3.1 入门3.2 常用开发方式3.2.1 传统开发方式3.2.2 代理开发方式第四部分:Mybatis配置文件深入4.1 核心配置文件4.1.1 层级关系4.1.2 常用配置4.2 映射配置文件4.2.1 动态sql之if标签4.2.2 动态sql之forea原创 2021-05-19 15:12:42 · 302 阅读 · 3 评论 -
这么强大的Mybatis插件机制原来就是这?
文章目录Mybatis插件机制介绍自定义一个Mybatis插件插件执行原理分析插件定义插件初始化插件如何生效总结Mybatis开发中经常会用到pagehelper分页插件,除此之外还有慢sql上报等各种各样的插件,那么Mybatis是如何来实现如此强大的插件机制呢?一起来看看吧。Mybatis插件机制介绍MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:Executor (update, query, flushSta原创 2021-05-18 15:33:51 · 496 阅读 · 8 评论 -
Java Attach API使用笔记
文章目录需求和目的实现过程创建Attach程序创建Agent程序启动程序达到的效果总结手敲代码来体验IDEA+ASM+Java Attach API实现方法增强的一个示例过程记录。需求和目的/** * 模拟业务方法 * @author xujian * 2021-03-12 10:52 **/public class MyBizMain { public String foo() { return "------我是MyBizMain-----"; }原创 2021-03-15 14:21:14 · 931 阅读 · 5 评论 -
Skywalking如何通过修改字节码让插件生效
文章目录ByteBuddy入门自定义Skywalking插件1、引入依赖编写插件定义编写拦截器使用的哪种字节码操作框架如何修改字节码总结背景:大家都在说Skywalking Agent实现的核心原理就是Java Agent+字节码操作。但是这两者是如何起作用的,一直比较模糊,所以通过这篇博客来记录一下解疑答惑的过程。通过这篇博客应该可以解答如下几个问题:Skywalking具体使用什么来操作字节码;Skywalking的插件是怎么开发的;Skywalking是怎么让插件生效的;ByteB原创 2021-03-06 19:53:07 · 1522 阅读 · 4 评论 -
Gson序列化LinkedHashMap.Entry失败的探索
文章目录问题重现原因探究验证结论使用Gson序列化LinkedHashMap本身为什么没问题其他拓展总结问题重现示例代码如下:Map<String, Object> map = new LinkedHashMap<>(); map.put("name", "xujian"); map.put("age", 25); Gson gson = new Gson(); for (Map.Entry<String,原创 2021-02-05 15:44:45 · 590 阅读 · 5 评论 -
Bean Copy也就这么点事了!
总结Java中对象拷贝的那些事,来看看哦~原创 2020-12-27 12:14:54 · 2105 阅读 · 2 评论 -
GitLab的Webhook配置和开发
基于GitLab的Webhook对Merge Request和Tag Push事件自动发送企业微信通知。原创 2020-12-07 15:53:51 · 17264 阅读 · 0 评论 -
设计模式-Command模式
文章目录介绍解决的问题使用场合示例普通实现命令模式实现命令模式和策略模式的区别相同点不同点总结命令模式是一种行为型模式。请求以命令的形式包裹在对象中,并传递给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。简单而言,就是调用者->命令->执行者,将调用者和执行者解耦。介绍命令模式主要定义了三种角色:Receiver:执行命令的对象;Command:命令;Invoker:命令的发起者;UML关系图:解决的问题在软件系统中,行原创 2020-12-01 17:29:59 · 1095 阅读 · 0 评论 -
AQS(AbstractQueuedSynchronizer)
AQS(AbstractQueuedSynchronizer) 目录 一、概述 二、AQS工作原理 acquire(int) tryAcquire(int) addWaiter(Node) acquireQueued...原创 2018-12-15 22:36:00 · 394 阅读 · 0 评论 -
Jackson中DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT和DeserializationFeature. ACCEPT_EMP
文章目录DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECTDeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT总结Jackson使用过程中的一些疑惑和跟踪。DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT首先先来看看这个配置项对应的JavaDoc:/** * Feature that can be原创 2020-11-03 15:32:43 · 4498 阅读 · 3 评论 -
又长见识了!JVM编译优化
即时编译器会对正在运行的服务进行一系列的优化,包括字节码解析过程中的分析,根据编译过程中代码的一些中间形式来做局部优化,还会根据程序依赖图进行全局优化,最后才会生成机器码。原创 2020-10-28 17:08:55 · 880 阅读 · 0 评论 -
事物传播属性在项目中的实践
文章目录场景分析测试&问题描述问题追踪解决方案总结Spring事物传播属性:1)Propagation.REQUIRED):支持当前事务,如果当前有事务, 那么加入事务, 如果当前没有事务则新建一个(默认情况)2)Propagation.NOT_SUPPORTED : 以非事务方式执行操作,如果当前存在事务就把当前事务挂起,执行完后恢复事务(忽略当前事务);3)Propagation.SUPPORTS :如果当前有事务则加入,如果没有则不用事务。4)Propagation.MANDAT原创 2020-08-12 13:41:04 · 283 阅读 · 0 评论 -
RocketMQ第二期:生产者、消费者启动原理
从代码层面解析生产者、消费者启动原理以及消息发送的原理。原创 2020-07-24 18:36:04 · 1326 阅读 · 0 评论 -
RocketMQ消费者设置了instanceName属性后消息竟不翼而飞
文章目录生产者代码(Producer.java)消费者代码(Consumer.java)消费紊乱的情况InstanceNameClientId消费均衡RebalanceImpl.javaAllocateMessageQueueAveragely.java总结本文介绍RocketMQ使用过程中遇到的一个坑:集群模式下一个机器起了多个消费者导致消费紊乱。下面将项目中遇到的问题简化成官方demo来说明。生产者代码(Producer.java)/* * Instantiate with原创 2020-05-17 16:13:15 · 2697 阅读 · 4 评论 -
Apollo配置中心三:自动添加配置更新listener组件
本文介绍在《Apollo配置中心二:环境隔离方案》的基础上开发基于注解自动添加配置更新监听器的组件,也是对《Apollo配置中心二:环境隔离方案》第6章的补充。原创 2020-04-26 10:18:21 · 3035 阅读 · 0 评论 -
Apollo配置中心二:环境隔离方案
文章目录1. 前提2. 基本思想3. 实施步骤4. 那些修改以后要重新加载bean的配置自动更新的处理5. 后续改进Apollo本身就支持环境隔离,你可以配置不同的environment来实现,当然你也可以给不同环境搭建不同的apollo服务(如果你资源充足的话)。但是这篇文章讲的是在资源有限的情况下如何实现环境隔离。1. 前提该方案的前提是:你只有一个test的apollo服务和...原创 2020-04-14 19:58:32 · 1574 阅读 · 0 评论 -
Apollo配置中心一:入门
文章目录1. Apollo概念2. Apollo架构整体架构客户端设计3.Apollo管理界面常用功能新增应用新增namespace(配置文件)关联公共namespace公共namespace私有namespace配置文件权限配置4.Apollo客户端接入(以SpringBoot项目为例)1. 引入依赖2. 配置Apollo1.设置appid2. 配置Apollo使其生效3. 配置meta_ser...原创 2020-04-14 17:53:24 · 535 阅读 · 0 评论 -
【自定义注解使用】增加service层方法访问日志
自定义注解的使用:AspectJ+Annotation原创 2019-09-03 16:07:26 · 1187 阅读 · 3 评论